diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + 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 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/com/szpg/task/SetWSThresholdTask.java b/src/com/szpg/task/SetWSThresholdTask.java new file mode 100644 index 0000000..b0fe50b --- /dev/null +++ b/src/com/szpg/task/SetWSThresholdTask.java @@ -0,0 +1,188 @@ +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetWSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetWSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的温湿度报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("温湿度检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置温度报警阈值 + SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand(); + setTemThreCmd.setThreshold((float) wdHigh); + PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet"); + if (null != temBlObj) { + setTemThreCmd.setMessageProducerId(sour); + setTemThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setTemThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) wdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setTemThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setTemThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 间隔半秒设置湿度阈值 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送设置湿度报警阈值 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold((float) sdHigh); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) sdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正温湿度报警阈值 定时任务"); + } + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/com/szpg/task/SetWSThresholdTask.java b/src/com/szpg/task/SetWSThresholdTask.java new file mode 100644 index 0000000..b0fe50b --- /dev/null +++ b/src/com/szpg/task/SetWSThresholdTask.java @@ -0,0 +1,188 @@ +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetWSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetWSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的温湿度报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("温湿度检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置温度报警阈值 + SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand(); + setTemThreCmd.setThreshold((float) wdHigh); + PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet"); + if (null != temBlObj) { + setTemThreCmd.setMessageProducerId(sour); + setTemThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setTemThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) wdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setTemThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setTemThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 间隔半秒设置湿度阈值 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送设置湿度报警阈值 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold((float) sdHigh); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) sdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正温湿度报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/util/DataPushInterface.java b/src/com/szpg/util/DataPushInterface.java new file mode 100644 index 0000000..017ed15 --- /dev/null +++ b/src/com/szpg/util/DataPushInterface.java @@ -0,0 +1,258 @@ +package com.szpg.util; + +public class DataPushInterface { + + public static String apiUrl = Configure.getProperty("sys", "SZGLGS_API_URL", "http://10.10.2.19:9056/"); + + /** + * 推送温度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param tempValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addTempData(String zcbh, String tempValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(tempValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送温度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addTempAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("温度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param humValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addHumData(String zcbh, String humValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(humValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHumAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BLBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("湿度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param ch4Value 甲烷浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCH4Data(String zcbh, String ch4Value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(ch4Value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCH4AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("甲烷高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param coValue 一氧化碳浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCOData(String zcbh, String coValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(coValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCOAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("一氧化碳高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param o2value 氧气浓度值 + * @param ts 时间戳 + * @return + */ + public static String addO2Data(String zcbh, String o2value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(o2value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addO2AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("氧气低浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param hsValue 硫化氢浓度值 + * @param ts 时间戳 + * @return + */ + public static String addHSData(String zcbh, String hsValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(hsValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHSAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("硫化氢高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/com/szpg/task/SetWSThresholdTask.java b/src/com/szpg/task/SetWSThresholdTask.java new file mode 100644 index 0000000..b0fe50b --- /dev/null +++ b/src/com/szpg/task/SetWSThresholdTask.java @@ -0,0 +1,188 @@ +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetWSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetWSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的温湿度报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("温湿度检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置温度报警阈值 + SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand(); + setTemThreCmd.setThreshold((float) wdHigh); + PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet"); + if (null != temBlObj) { + setTemThreCmd.setMessageProducerId(sour); + setTemThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setTemThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) wdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setTemThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setTemThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 间隔半秒设置湿度阈值 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送设置湿度报警阈值 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold((float) sdHigh); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) sdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正温湿度报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/util/DataPushInterface.java b/src/com/szpg/util/DataPushInterface.java new file mode 100644 index 0000000..017ed15 --- /dev/null +++ b/src/com/szpg/util/DataPushInterface.java @@ -0,0 +1,258 @@ +package com.szpg.util; + +public class DataPushInterface { + + public static String apiUrl = Configure.getProperty("sys", "SZGLGS_API_URL", "http://10.10.2.19:9056/"); + + /** + * 推送温度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param tempValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addTempData(String zcbh, String tempValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(tempValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送温度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addTempAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("温度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param humValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addHumData(String zcbh, String humValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(humValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHumAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BLBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("湿度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param ch4Value 甲烷浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCH4Data(String zcbh, String ch4Value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(ch4Value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCH4AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("甲烷高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param coValue 一氧化碳浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCOData(String zcbh, String coValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(coValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCOAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("一氧化碳高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param o2value 氧气浓度值 + * @param ts 时间戳 + * @return + */ + public static String addO2Data(String zcbh, String o2value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(o2value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addO2AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("氧气低浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param hsValue 硫化氢浓度值 + * @param ts 时间戳 + * @return + */ + public static String addHSData(String zcbh, String hsValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(hsValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHSAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("硫化氢高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } +} diff --git a/src/com/szpg/util/UnicodeConvertor.java b/src/com/szpg/util/UnicodeConvertor.java new file mode 100644 index 0000000..791f2cc --- /dev/null +++ b/src/com/szpg/util/UnicodeConvertor.java @@ -0,0 +1,38 @@ +package com.szpg.util; + +import org.apache.commons.lang3.StringUtils; + +public class UnicodeConvertor { + + public static String string2Unicode(String string) { + if (StringUtils.isEmpty(string) == true) { + return ""; + } + + StringBuffer unicode = new StringBuffer(); + for (int i = 0; i < string.length(); i++) { + // 取出每一个字符 + char c = string.charAt(i); + + // 转换为unicode + unicode.append("\\u" + Integer.toHexString(c)); + } + + return unicode.toString(); + } + + public static String unicode2String(String unicode) { + StringBuffer string = new StringBuffer(); + String[] hex = unicode.split("\\\\u"); + for (int i = 1; i < hex.length; i++) { + // 转换出每一个代码点 + int data = Integer.parseInt(hex[i], 16); + + // 追加成string + string.append((char) data); + } + + return string.toString(); + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/com/szpg/task/SetWSThresholdTask.java b/src/com/szpg/task/SetWSThresholdTask.java new file mode 100644 index 0000000..b0fe50b --- /dev/null +++ b/src/com/szpg/task/SetWSThresholdTask.java @@ -0,0 +1,188 @@ +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetWSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetWSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的温湿度报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("温湿度检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置温度报警阈值 + SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand(); + setTemThreCmd.setThreshold((float) wdHigh); + PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet"); + if (null != temBlObj) { + setTemThreCmd.setMessageProducerId(sour); + setTemThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setTemThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) wdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setTemThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setTemThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 间隔半秒设置湿度阈值 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送设置湿度报警阈值 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold((float) sdHigh); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) sdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正温湿度报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/util/DataPushInterface.java b/src/com/szpg/util/DataPushInterface.java new file mode 100644 index 0000000..017ed15 --- /dev/null +++ b/src/com/szpg/util/DataPushInterface.java @@ -0,0 +1,258 @@ +package com.szpg.util; + +public class DataPushInterface { + + public static String apiUrl = Configure.getProperty("sys", "SZGLGS_API_URL", "http://10.10.2.19:9056/"); + + /** + * 推送温度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param tempValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addTempData(String zcbh, String tempValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(tempValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送温度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addTempAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("温度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param humValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addHumData(String zcbh, String humValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(humValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHumAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BLBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("湿度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param ch4Value 甲烷浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCH4Data(String zcbh, String ch4Value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(ch4Value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCH4AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("甲烷高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param coValue 一氧化碳浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCOData(String zcbh, String coValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(coValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCOAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("一氧化碳高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param o2value 氧气浓度值 + * @param ts 时间戳 + * @return + */ + public static String addO2Data(String zcbh, String o2value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(o2value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addO2AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("氧气低浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param hsValue 硫化氢浓度值 + * @param ts 时间戳 + * @return + */ + public static String addHSData(String zcbh, String hsValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(hsValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHSAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("硫化氢高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } +} diff --git a/src/com/szpg/util/UnicodeConvertor.java b/src/com/szpg/util/UnicodeConvertor.java new file mode 100644 index 0000000..791f2cc --- /dev/null +++ b/src/com/szpg/util/UnicodeConvertor.java @@ -0,0 +1,38 @@ +package com.szpg.util; + +import org.apache.commons.lang3.StringUtils; + +public class UnicodeConvertor { + + public static String string2Unicode(String string) { + if (StringUtils.isEmpty(string) == true) { + return ""; + } + + StringBuffer unicode = new StringBuffer(); + for (int i = 0; i < string.length(); i++) { + // 取出每一个字符 + char c = string.charAt(i); + + // 转换为unicode + unicode.append("\\u" + Integer.toHexString(c)); + } + + return unicode.toString(); + } + + public static String unicode2String(String unicode) { + StringBuffer string = new StringBuffer(); + String[] hex = unicode.split("\\\\u"); + for (int i = 1; i < hex.length; i++) { + // 转换出每一个代码点 + int data = Integer.parseInt(hex[i], 16); + + // 追加成string + string.append((char) data); + } + + return string.toString(); + } + +} diff --git a/src/log4j.properties b/src/log4j.properties index da9f862..abf92ca 100644 --- a/src/log4j.properties +++ b/src/log4j.properties @@ -4,7 +4,7 @@ #log4j.rootLogger=info, stdout log4j.logger.send=info, bytes, stdout log4j.logger.recv=info, bytes, stdout -log4j.logger.com.szpg=debug, stdout +log4j.logger.com.szpg=info, message, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out @@ -20,5 +20,12 @@ log4j.additivity.send=false log4j.additivity.recv=false +#message logger +log4j.appender.message=org.apache.log4j.DailyRollingFileAppender +log4j.appender.message.file=D\:/deploy/pgdsc/log/info.log +log4j.appender.message.layout=org.apache.log4j.PatternLayout +log4j.appender.message.layout.ConversionPattern=%d %-5p [%-4c{1}] %m%n +log4j.appender.message.encoding=UTF-8 + #other logger log4j.logger.com.mchange=error \ No newline at end of file diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/com/szpg/task/SetWSThresholdTask.java b/src/com/szpg/task/SetWSThresholdTask.java new file mode 100644 index 0000000..b0fe50b --- /dev/null +++ b/src/com/szpg/task/SetWSThresholdTask.java @@ -0,0 +1,188 @@ +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetWSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetWSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的温湿度报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("温湿度检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置温度报警阈值 + SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand(); + setTemThreCmd.setThreshold((float) wdHigh); + PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet"); + if (null != temBlObj) { + setTemThreCmd.setMessageProducerId(sour); + setTemThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setTemThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) wdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setTemThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setTemThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 间隔半秒设置湿度阈值 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送设置湿度报警阈值 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold((float) sdHigh); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) sdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正温湿度报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/util/DataPushInterface.java b/src/com/szpg/util/DataPushInterface.java new file mode 100644 index 0000000..017ed15 --- /dev/null +++ b/src/com/szpg/util/DataPushInterface.java @@ -0,0 +1,258 @@ +package com.szpg.util; + +public class DataPushInterface { + + public static String apiUrl = Configure.getProperty("sys", "SZGLGS_API_URL", "http://10.10.2.19:9056/"); + + /** + * 推送温度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param tempValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addTempData(String zcbh, String tempValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(tempValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送温度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addTempAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("温度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param humValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addHumData(String zcbh, String humValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(humValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHumAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BLBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("湿度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param ch4Value 甲烷浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCH4Data(String zcbh, String ch4Value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(ch4Value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCH4AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("甲烷高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param coValue 一氧化碳浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCOData(String zcbh, String coValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(coValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCOAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("一氧化碳高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param o2value 氧气浓度值 + * @param ts 时间戳 + * @return + */ + public static String addO2Data(String zcbh, String o2value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(o2value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addO2AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("氧气低浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param hsValue 硫化氢浓度值 + * @param ts 时间戳 + * @return + */ + public static String addHSData(String zcbh, String hsValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(hsValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHSAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("硫化氢高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } +} diff --git a/src/com/szpg/util/UnicodeConvertor.java b/src/com/szpg/util/UnicodeConvertor.java new file mode 100644 index 0000000..791f2cc --- /dev/null +++ b/src/com/szpg/util/UnicodeConvertor.java @@ -0,0 +1,38 @@ +package com.szpg.util; + +import org.apache.commons.lang3.StringUtils; + +public class UnicodeConvertor { + + public static String string2Unicode(String string) { + if (StringUtils.isEmpty(string) == true) { + return ""; + } + + StringBuffer unicode = new StringBuffer(); + for (int i = 0; i < string.length(); i++) { + // 取出每一个字符 + char c = string.charAt(i); + + // 转换为unicode + unicode.append("\\u" + Integer.toHexString(c)); + } + + return unicode.toString(); + } + + public static String unicode2String(String unicode) { + StringBuffer string = new StringBuffer(); + String[] hex = unicode.split("\\\\u"); + for (int i = 1; i < hex.length; i++) { + // 转换出每一个代码点 + int data = Integer.parseInt(hex[i], 16); + + // 追加成string + string.append((char) data); + } + + return string.toString(); + } + +} diff --git a/src/log4j.properties b/src/log4j.properties index da9f862..abf92ca 100644 --- a/src/log4j.properties +++ b/src/log4j.properties @@ -4,7 +4,7 @@ #log4j.rootLogger=info, stdout log4j.logger.send=info, bytes, stdout log4j.logger.recv=info, bytes, stdout -log4j.logger.com.szpg=debug, stdout +log4j.logger.com.szpg=info, message, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out @@ -20,5 +20,12 @@ log4j.additivity.send=false log4j.additivity.recv=false +#message logger +log4j.appender.message=org.apache.log4j.DailyRollingFileAppender +log4j.appender.message.file=D\:/deploy/pgdsc/log/info.log +log4j.appender.message.layout=org.apache.log4j.PatternLayout +log4j.appender.message.layout.ConversionPattern=%d %-5p [%-4c{1}] %m%n +log4j.appender.message.encoding=UTF-8 + #other logger log4j.logger.com.mchange=error \ No newline at end of file diff --git a/src/struts.xml b/src/struts.xml index 699bbda..df8b294 100644 --- a/src/struts.xml +++ b/src/struts.xml @@ -2,15 +2,24 @@ - - - - - - + + + + + + + + + + + + + + + diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 8d5f44a..29ed29f 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -82,47 +82,47 @@ #\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf -THXC.ACU001.DS.COUNT = 15 +THXC.ACU001.DS.COUNT = 9 #\u65e0\u7ebf\u5bf9\u5c04\u8bbe\u5907\u7f16\u7801\u5217\u8868 -THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.DIR04;THXC.ACU001.J.DIR05;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.SIR04;THXC.ACU001.J.SIR05;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03;THXC.ACU001.J.RIR04;THXC.ACU001.J.RIR05 +THXC.ACU001.DS.ZC.LIST = THXC.ACU001.J.DIR01;THXC.ACU001.J.DIR02;THXC.ACU001.J.DIR03;THXC.ACU001.J.SIR01;THXC.ACU001.J.SIR02;THXC.ACU001.J.SIR03;THXC.ACU001.J.RIR01;THXC.ACU001.J.RIR02;THXC.ACU001.J.RIR03 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.DSALM.WORDCOUNT = 3 +THXC.ACU001.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf -THXC.ACU001.FJ.COUNT = 9 +THXC.ACU001.FJ.COUNT = 6 #\u98ce\u673a\u7f16\u7801\u5217\u8868 -THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.DFJ03;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.SFJ03;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02;THXC.ACU001.F.RFJ03 +THXC.ACU001.FJ.ZC.LIST = THXC.ACU001.F.DFJ01;THXC.ACU001.F.DFJ02;THXC.ACU001.F.SFJ01;THXC.ACU001.F.SFJ02;THXC.ACU001.F.RFJ01;THXC.ACU001.F.RFJ02 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJSTAT.START = 16 #\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJSTAT.WORDCOUNT = 5 +THXC.ACU001.FJSTAT.WORDCOUNT = 3 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.FJRT.START = 200 #\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.FJRT.WORDCOUNT = 48 +THXC.ACU001.FJRT.WORDCOUNT = 42 #\u6c34\u6cf5\u6570\u91cf -THXC.ACU001.SB.COUNT = 19 +THXC.ACU001.SB.COUNT = 10 #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 -THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.DSB05;THXC.ACU001.P.DSB06;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.SSB03;THXC.ACU001.P.SSB04;THXC.ACU001.P.SSB05;THXC.ACU001.P.SSB06;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04;THXC.ACU001.P.RSB05;THXC.ACU001.P.RSB06;THXC.ACU001.P.RSB07 +THXC.ACU001.SB.ZC.LIST = THXC.ACU001.P.DSB01;THXC.ACU001.P.DSB02;THXC.ACU001.P.DSB03;THXC.ACU001.P.DSB04;THXC.ACU001.P.SSB01;THXC.ACU001.P.SSB02;THXC.ACU001.P.RSB01;THXC.ACU001.P.RSB02;THXC.ACU001.P.RSB03;THXC.ACU001.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU001.SBSTAT.START = 5 +THXC.ACU001.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBSTAT.WORDCOUNT = 8 +THXC.ACU001.SBSTAT.WORDCOUNT = 17 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU001.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -THXC.ACU001.SBRT.WORDCOUNT = 88 +THXC.ACU001.SBRT.WORDCOUNT = 64 #\u7167\u660e\u6570\u91cf THXC.ACU001.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.RZM01;THXC.ACU001.Z.RZM02;THXC.ACU001.Z.RZM03 +THXC.ACU001.ZM.ZC.LIST = THXC.ACU001.Z.DZM01;THXC.ACU001.Z.SZM01;THXC.ACU001.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -134,13 +134,13 @@ #\u4e95\u76d6\u6570\u91cf -THXC.ACU001.JG.COUNT = 4 +THXC.ACU001.JG.COUNT = 2 #\u4e95\u76d6\u7f16\u7801\u5217\u8868 -THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.DJG01;THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02;THXC.ACU001.J.RJG03 +THXC.ACU001.JG.ZC.LIST = THXC.ACU001.J.RJG01;THXC.ACU001.J.RJG02 #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU001.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU001.JGSTAT.WORDCOUNT = 1 +THXC.ACU001.JGSTAT.WORDCOUNT = 6 @@ -232,7 +232,7 @@ #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.DSALM.START = 38 #\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.DSALM.WORDCOUNT = 3 +THXC.ACU002.DSALM.WORDCOUNT = 2 #\u98ce\u673a\u6570\u91cf @@ -254,9 +254,9 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU002.SB.ZC.LIST = THXC.ACU002.P.DSB01;THXC.ACU002.P.DSB02;THXC.ACU002.P.DSB03;THXC.ACU002.P.DSB04;THXC.ACU002.P.SSB01;THXC.ACU002.P.SSB02;THXC.ACU002.P.SSB03;THXC.ACU002.P.SSB04;THXC.ACU002.P.RSB01;THXC.ACU002.P.RSB02;THXC.ACU002.P.RSB03;THXC.ACU002.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU002.SBSTAT.START = 5 +THXC.ACU002.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU002.SBSTAT.WORDCOUNT = 5 +THXC.ACU002.SBSTAT.WORDCOUNT = 18 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 THXC.ACU002.SBRT.START = 100 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 @@ -266,7 +266,7 @@ #\u7167\u660e\u6570\u91cf THXC.ACU002.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.DZM01;THXC.ACU002.Z.SZM01;THXC.ACU002.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU002.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -398,7 +398,7 @@ #\u6c34\u6cf5\u7f16\u7801\u5217\u8868 THXC.ACU003.SB.ZC.LIST = THXC.ACU003.P.DSB01;THXC.ACU003.P.DSB02;THXC.ACU003.P.DSB03;THXC.ACU003.P.DSB04;THXC.ACU003.P.SSB01;THXC.ACU003.P.SSB02;THXC.ACU003.P.SSB03;THXC.ACU003.P.SSB04;THXC.ACU003.P.RSB01;THXC.ACU003.P.RSB02;THXC.ACU003.P.RSB03;THXC.ACU003.P.RSB04 #\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 -THXC.ACU003.SBSTAT.START = 5 +THXC.ACU003.SBSTAT.START = 50 #\u6c34\u6cf5\u72b6\u6001\u6240\u5360\u5b57\u6570 THXC.ACU003.SBSTAT.WORDCOUNT = 5 #\u6c34\u6cf5\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 @@ -984,17 +984,17 @@ #\u7167\u660e\u6570\u91cf -#THXC.ACU002.ZM.COUNT = 3 +THXC.ACU008.ZM.COUNT = 3 #\u7167\u660e\u7f16\u7801\u5217\u8868 -#THXC.ACU002.ZM.ZC.LIST = THXC.ACU002.Z.RZM01;THXC.ACU002.Z.RZM02;THXC.ACU002.Z.RZM03 +THXC.ACU008.ZM.ZC.LIST = THXC.ACU008.Z.SZM01;THXC.ACU008.Z.RZM01 #\u7167\u660e\u72b6\u6001\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMSTAT.START = 2 +THXC.ACU008.ZMSTAT.START = 2 #\u7167\u660e\u72b6\u6001\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMSTAT.WORDCOUNT = 1 +THXC.ACU008.ZMSTAT.WORDCOUNT = 1 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 -#THXC.ACU002.ZMRT.START = 70 +THXC.ACU008.ZMRT.START = 70 #\u7167\u660e\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 -#THXC.ACU002.ZMRT.WORDCOUNT = 16 +THXC.ACU008.ZMRT.WORDCOUNT = 14 #\u4e95\u76d6\u6570\u91cf @@ -2014,4 +2014,20 @@ #\u4e95\u76d6\u72b6\u6001\u8d77\u59cb\u5730\u5740 THXC.ACU016.JGSTAT.START = 3 #\u4e95\u76d6\u72b6\u6001\u6240\u5360\u5b57\u6570 -THXC.ACU016.JGSTAT.WORDCOUNT = 1 \ No newline at end of file +THXC.ACU016.JGSTAT.WORDCOUNT = 1 + + + +######## \u9f99\u7fd4\u8def\u71c3\u6c14\u6bb5 THXC.ACU801 ######## +#\u98ce\u673a\u6570\u91cf +THXC.ACU801.FJ.COUNT = 1 +#\u98ce\u673a\u7f16\u7801\u5217\u8868 +THXC.ACU801.FJ.ZC.LIST = THXC.ACU801.F.DFJ01 +#\u98ce\u673a\u72b6\u6001\u8d77\u59cb\u5730\u5740 +THXC.ACU801.FJSTAT.START = 16 +#\u98ce\u673a\u72b6\u6001\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJSTAT.WORDCOUNT = 1 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u8d77\u59cb\u5730\u5740 +THXC.ACU016.FJRT.START = 200 +#\u98ce\u673a\u8fd0\u884c\u65f6\u957f\u6240\u5360\u5b57\u6570 +THXC.ACU016.FJRT.WORDCOUNT = 34 \ No newline at end of file diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 7c92b69..1173e76 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -47,9 +47,9 @@ public static void main(String[] args) { // PLC设备地址和端口 - ACUClient client = new ACUClient("192.168.0.244", 9600); + ACUClient client = new ACUClient("172.20.10.5", 9600); - PgAcu acu = new PgAcuDaoImpl().findACUById(1); + PgAcu acu = new PgAcuDaoImpl().findACUById(14); client.setAcucode(acu.getAcu_code()); client.setNet(acu.getAcu_net()); //网络号 client.setNode(acu.getAcu_node()); //节点号 @@ -68,6 +68,7 @@ // 温湿度 // dsc.testSendWSCommand(); // dsc.testSendWSStatusCommand(); +// dsc.testSendWSThresholdCommand("THXC.ACU016.J.RWS02"); // 一氧化碳 // dsc.testSendCOCommand(); @@ -370,49 +371,49 @@ /** * 设置甲烷报警阈值 */ - private void testSendCH4ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCH4ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCH4ThresholdTask(deviceCode, 40.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendHSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendHSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetHSThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置硫化氢报警阈值 */ - private void testSendWSThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - - ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); - sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); - sche2.shutdown(); - } +// private void testSendWSThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetWdThresholdTask(deviceCode, 35.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// +// ScheduledExecutorService sche2 = new ScheduledThreadPoolExecutor(1); +// sche2.schedule(new SetSdThresholdTask(deviceCode, 75.0f), 20, TimeUnit.SECONDS); +// sche2.shutdown(); +// } /** * 设置氧气报警阈值 */ - private void testSendO2ThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendO2ThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetO2ThresholdTask(deviceCode, 18.0f), 15, TimeUnit.SECONDS); +// sche.shutdown(); +// } /** * 设置一氧化碳报警阈值 */ - private void testSendCOThresholdCommand(String deviceCode) { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); - sche.shutdown(); - } +// private void testSendCOThresholdCommand(String deviceCode) { +// ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); +// sche.schedule(new SetCOThresholdTask(deviceCode, 55.0f), 20, TimeUnit.SECONDS); +// sche.shutdown(); +// } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java new file mode 100644 index 0000000..039766e --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -0,0 +1,10 @@ +package com.szpg.db.dao; + +import com.szpg.db.data.PgAlarm; + +public interface PgAlarmDao { + + public int findAlarmCountByDate(String date); + + public long insertAlarmRecord(PgAlarm alarmRecord); +} diff --git a/src/com/szpg/db/dao/PgAlarmRuleDao.java b/src/com/szpg/db/dao/PgAlarmRuleDao.java new file mode 100644 index 0000000..42be4c6 --- /dev/null +++ b/src/com/szpg/db/dao/PgAlarmRuleDao.java @@ -0,0 +1,16 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgAlarmRule; + +public interface PgAlarmRuleDao { + + public List findAllRule(); + public PgAlarmRule findRuleById(Integer id); + + public List findRuleByDevtype(String devtype); + public PgAlarmRule findRuleByDevice(Integer deviceId); + + public int updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd); +} diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 09805ed..476e92b 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index 6196f6e..f61d415 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 016be43..e6bbf30 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -10,6 +10,7 @@ public String findAcuCodeByCode(String code); public Integer findDeviceIdByCode(String code); + public PgDevice findDeviceById(Integer deviceId); public List findDeviceByAcu(String acucode); public int addGenerlAlarmRecord(PgAlarm alarmRec); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index ab4260f..84c4bba 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 5c29ac2..e760669 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,8 @@ public List findPblzByDevice(Integer deviceid); public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastValueByDevice(Integer deviceid); + public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 5411998..370a83f 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -3,7 +3,6 @@ import java.util.List; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; /** * 温湿度相关参数读写的数据库接口 @@ -20,17 +19,20 @@ public List findWsdzByDevice(Integer deviceid); public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + public double findLastTempByDevice(Integer deviceid); + public double findLastHumByDevice(Integer deviceid); + public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); /******** 温湿度报警状态 ********/ - public List findAllWsdbj(); - public PgTemphumAlm findWsdbjById(Integer id); +// public List findAllWsdbj(); +// public PgTemphumAlm findWsdbjById(Integer id); - public List findWsdbjByDevice(Integer deviceid); - public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); +// public List findWsdbjByDevice(Integer deviceid); +// public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); - public int addWsdbjRecord(PgTemphumAlm wsalm); - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +// public int addWsdbjRecord(PgTemphumAlm wsalm); +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); } diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java new file mode 100644 index 0000000..9831ca8 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -0,0 +1,91 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ScalarHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.TimeFormat; + +public class PgAlarmDaoImpl implements PgAlarmDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + + @Override + public int findAlarmCountByDate(String date) { + Connection conn = null; + String sql = "SELECT COUNT(ID) FROM PG_ALARM WHERE TO_CHAR(ALARM_DATE, 'YYYY-MM-DD') = ?"; + Object[] param = new Object[1]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = date; + + int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + return count; + } catch (Exception ex) { + logger.error("根据日期查询报警记录数异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public long insertAlarmRecord(PgAlarm alarmRecord) { + Connection conn = null; + String sql = "INSERT INTO PG_ALARM " + + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?)"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; + long id = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[8]; + + params[0] = id; + params[1] = alarmRecord.getActive(); + params[2] = TimeFormat.formatTimestamp(alarmRecord.getAlarm_date()); + params[3] = alarmRecord.getAlarm_value(); + params[4] = alarmRecord.getDescription(); + params[5] = alarmRecord.getAlarmdevid(); + params[6] = alarmRecord.getAlarmtypeid(); + params[7] = alarmRecord.getUserid(); + + int count = runner.update(conn, sql, params); // 新增主表 + + if (count > 0) + logger.debug("插入报警数据成功"); + else { + logger.error("插入报警数据失败!"); + } + return id; + } catch (Exception ex) { + logger.error("插入报警数据异常", ex); + return 0; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java new file mode 100644 index 0000000..ec81ba6 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgAlarmRuleDaoImpl.java @@ -0,0 +1,188 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgAlarmRuleDaoImpl implements PgAlarmRuleDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllRule() { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE ORDER BY ID"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class)); + + if (null != list && list.isEmpty() == false) { + logger.debug("查询所有报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 findRuleByDevtype(String devtype) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE DEVTYPE = ?"; + Object[] param = new Object[1]; + param[0] = devtype; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备类型查询报警规则成功[" + list.size() + "]"); + + 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 PgAlarmRule findRuleByDevice(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ALARM_RULE WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAlarmRule.class), param); + + if (null != list && list.size() == 1) { + logger.debug("根据设备ID查询报警规则成功[" + list.size() + "]"); + + return list.get(0); + } 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 updateWSHighThresholdByDevice(Integer deviceId, Double wd, Double sd) { + Connection conn = null; + + String sql = "UPDATE PG_ALARM_RULE SET HIGHVALUE = ? WHERE PGDEVICEID = ?"; + Object[] params = new Object[2]; + params[0] = NumberFormat.format(wd, "0.00") + ";" + NumberFormat.format(sd, "0.00"); + params[1] = deviceId; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + + int count = runner.update(conn, sql, params); + + if (count > 0) + logger.debug("更新温湿度高限报警阈值成功"); + else { + logger.error("更新温湿度高限报警阈值失败!"); + } + return count; + } catch (Exception ex) { + logger.error("更新温湿度高限报警阈值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index fc5b539..ad4becd 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCODao; @@ -262,10 +263,36 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CO FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的一氧化碳浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override - public int addPblzRecord(PgCO ch4) { - return addPblzRecord(ch4.getCo(), ch4.getTmStr(), ch4.getPgdeviceid()); + public int addPblzRecord(PgCO co) { + return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } @Override @@ -503,8 +530,8 @@ } @Override - public int addSbjzRecord(PgCOAlm ch4alm) { - return addSbjzRecord(ch4alm.getCoalm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + public int addSbjzRecord(PgCOAlm coAlm) { + return addSbjzRecord(coAlm.getCoalm(), coAlm.getTmStr(), coAlm.getPgdeviceid()); } @Override diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 61e9f36..9feac11 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgCh4Dao; @@ -263,6 +264,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT CH4 FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的甲烷浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgCh4 ch4) { diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 32f3994..c887a2d 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -6,6 +6,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.log4j.Logger; @@ -90,6 +91,39 @@ } return -1; } + + @Override + public PgDevice findDeviceById(Integer deviceId) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_DEVICE WHERE ID = ?"; + Object[] params = new Object[1]; + params[0] = deviceId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + PgDevice device = (PgDevice) runner.query(conn, queryStr, new BeanHandler(PgDevice.class), params); + + if (null != device) { + logger.debug("根据ID查询设备资产成功"); + + return device; + } 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 findDeviceByAcu(String acucode) { diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 344cd93..e1513fa 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgHSDao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT SH FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的硫化氢浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgSH sh) { diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index c046bd1..30ea656 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -9,6 +9,7 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgO2Dao; @@ -262,6 +263,32 @@ } return null; } + + @Override + public double findLastValueByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT O2 FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double value = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return value; + } catch (Exception ex) { + logger.error("根据设备查询最近的氧气浓度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addPblzRecord(PgO2 o2) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index a460aa5..439e285 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -9,11 +9,11 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; import com.szpg.db.dao.PgWsDao; import com.szpg.db.data.PgTemphum; -import com.szpg.db.data.PgTemphumAlm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -267,6 +267,58 @@ } return null; } + + @Override + public double findLastTempByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT TEMP FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double tempValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return tempValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的温度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } + + @Override + public double findLastHumByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT HUM FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + double humValue = NumberFormat.parseDouble((String) runner.query(conn, sql, new ScalarHandler(1), param), "0.00"); + return humValue; + } catch (Exception ex) { + logger.error("根据设备查询最近的湿度值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0.0; + } @Override public int addWsdzRecord(PgTemphum ws) { @@ -312,248 +364,248 @@ return 0; } - @Override - public List findAllWsdbj() { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 PgTemphumAlm findWsdbjById(Integer id) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(0); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); - - return wsalm; - } - 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 findWsdbjByDevice(Integer deviceid) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { - Connection conn = null; - - String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { - PgTemphumAlm wsalm = new PgTemphumAlm(); - Object[] item = tempList.get(i); - - wsalm.setId(((Number) item[0]).intValue()); - wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); - wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); - wsalm.setPgdeviceid(((Number) item[4]).intValue()); - - long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(tmValue); - wsalm.setLogtime(cal.getTime()); - wsalm.setUptime(cal.getTime()); - - list.add(wsalm); - } - 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 addWsdbjRecord(PgTemphumAlm wsalm) { - return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); - } - - @Override - public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { - Connection conn = null; - - String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + - "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; - Object[] params = new Object[5]; - params[0] = temp; - params[1] = hum; - params[2] = tm; - params[3] = tm; - params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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; - } +// @Override +// public List findAllWsdbj() { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 PgTemphumAlm findWsdbjById(Integer id) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(0); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); +// +// return wsalm; +// } +// 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 findWsdbjByDevice(Integer deviceid) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { +// Connection conn = null; +// +// String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_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++) { +// PgTemphumAlm wsalm = new PgTemphumAlm(); +// Object[] item = tempList.get(i); +// +// wsalm.setId(((Number) item[0]).intValue()); +// wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); +// wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); +// wsalm.setPgdeviceid(((Number) item[4]).intValue()); +// +// long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); +// Calendar cal = Calendar.getInstance(); +// cal.setTimeInMillis(tmValue); +// wsalm.setLogtime(cal.getTime()); +// wsalm.setUptime(cal.getTime()); +// +// list.add(wsalm); +// } +// 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 addWsdbjRecord(PgTemphumAlm wsalm) { +// return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); +// } +// +// @Override +// public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { +// Connection conn = null; +// +// String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + +// "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + +// "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; +// Object[] params = new Object[5]; +// params[0] = temp; +// params[1] = hum; +// params[2] = tm; +// params[3] = tm; +// params[4] = 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 + ", temp=" + temp + ", hum=" + hum + ", 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/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5b6f2d8..e3ebe69 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -20,10 +20,10 @@ private Integer alarmtypeid; private Integer userid; - public static Integer ALARM_TYPE_DEVRUN = 1; - public static Integer ALARM_TYPE_PGRUN = 2; - public static Integer ALARM_TYPE_PGSAF = 3; - public static Integer ALARM_TYPE_INPG = 4; + public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 + public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 + public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 + public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 public Integer getId() { return id; diff --git a/src/com/szpg/db/data/PgAlarmRule.java b/src/com/szpg/db/data/PgAlarmRule.java new file mode 100644 index 0000000..28c38a4 --- /dev/null +++ b/src/com/szpg/db/data/PgAlarmRule.java @@ -0,0 +1,84 @@ +package com.szpg.db.data; + +public class PgAlarmRule implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 6278928807122483056L; + + private Integer id; + private String devtype; + private String highvalue; + private String lowvalue; + private String unit; + private Integer alarmtypeid; + private Integer pgdeviceid; + + public static Integer ALARM_TYPE_DEVRUN = 1; + public static Integer ALARM_TYPE_PGRUN = 2; + public static Integer ALARM_TYPE_PGSAF = 3; + public static Integer ALARM_TYPE_INPG = 4; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getDevtype() { + return devtype; + } + + public void setDevtype(String devtype) { + this.devtype = devtype; + } + + public String getHighvalue() { + return highvalue; + } + + public void setHighvalue(String highvalue) { + this.highvalue = highvalue; + } + + public String getLowvalue() { + return lowvalue; + } + + public void setLowvalue(String lowvalue) { + this.lowvalue = lowvalue; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Integer getAlarmtypeid() { + return alarmtypeid; + } + + public void setAlarmtypeid(Integer alarmtypeid) { + this.alarmtypeid = alarmtypeid; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgAlarmRule[deviceid=" + pgdeviceid + ", high=" + highvalue + ", low= " + lowvalue + "]"; + } + +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java deleted file mode 100644 index 5f230f2..0000000 --- a/src/com/szpg/db/data/PgTemphumAlm.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.szpg.db.data; - -import java.io.Serializable; -import java.util.Date; - -import com.szpg.util.TimeFormat; - -public class PgTemphumAlm implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 3941256870587343705L; - - private Integer id; - private Boolean tempalm; - private Boolean humalm; - private Date logtime; - private Date uptime; - private Integer pgdeviceid; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getTempalm() { - return tempalm; - } - - public void setTempalm(Boolean tempalm) { - this.tempalm = tempalm; - } - - public Boolean getHumalm() { - return humalm; - } - - public void setHumalm(Boolean humalm) { - this.humalm = humalm; - } - - public Date getLogtime() { - return logtime; - } - - public void setLogtime(Date logtime) { - this.logtime = logtime; - } - - public Date getUptime() { - return uptime; - } - - public void setUptime(Date uptime) { - this.uptime = uptime; - } - - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - - public void setTm(Date tm) { - this.logtime = tm; - this.uptime = tm; - } - - public String getTmStr() { - if (null != this.logtime) { - return TimeFormat.formatTimestamp(logtime); - } else { - return ""; - } - } - - public String getTmStrGB() { - if (null != this.logtime) { - return TimeFormat.format(logtime, "yyyyMMddHHmmss"); - } else { - return ""; - } - } - - @Override - public String toString() { - return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; - } -} diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java deleted file mode 100644 index 9b92b1a..0000000 --- a/src/com/szpg/db/test/PgWSDaoTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.szpg.db.test; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.szpg.db.dao.PgWsDao; -import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.util.TimeFormat; - -public class PgWSDaoTest { - - private PgWsDao dao; - - @Before - public void setUp() throws Exception { - dao = new PgWsDaoImpl(); - } - -// @Test - public void testAddParamRecord() { - assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllParam() { - assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); - } - - @Test - public void testFindParamById() { - Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); - } - -// @Test - public void testAddStatusRecord() { - assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); - } - - @Test - public void testFindAllStatus() { - assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); - } - - @Test - public void testFindStatusById() { - Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); - } - -} diff --git a/src/com/szpg/plc/PGDSCServlet.java b/src/com/szpg/plc/PGDSCServlet.java index 91f1816..edf5810 100644 --- a/src/com/szpg/plc/PGDSCServlet.java +++ b/src/com/szpg/plc/PGDSCServlet.java @@ -13,7 +13,23 @@ import com.szpg.db.data.PgAcu; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; -import com.szpg.task.*; +import com.szpg.task.ACUSocketCheckTask; +import com.szpg.task.ReadAssetInSpectionTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; +import com.szpg.task.ReadHSStatusTask; +import com.szpg.task.ReadHSValueTask; +import com.szpg.task.ReadMaintanceTask; +import com.szpg.task.ReadO2ValueTask; +import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; +import com.szpg.task.SetCH4ThresholdTask; +import com.szpg.task.SetCOThresholdTask; +import com.szpg.task.SetHSThresholdTask; +import com.szpg.task.SetO2ThresholdTask; +import com.szpg.task.SetWSThresholdTask; +import com.szpg.util.Configure; public class PGDSCServlet extends HttpServlet { @@ -45,30 +61,30 @@ } // 3启动查询温湿度的定时任务 - sendWSCommand(); - sendWSStatusCommand(); + sendQueryWSValueCommand(); + sendSetWSThresholdCommand(); // 4启动查询甲烷的定时任务 - sendCH4Command(); - sendCH4StatusCommand(); + sendQueryCH4ValueCommand(); + sendSetCH4ThresholdCommand(); // 5启动查询一氧化碳的定时任务 - sendCOCommand(); - sendCOStatusCommand(); + sendQueryCOValueCommand(); + sendSetCOThresholdCommand(); // 6氧气 - sendO2Command(); - sendO2StatusCommand(); + sendQueryO2ValueCommand(); + sendSetO2ThresholdCommand(); // 7硫化氢 - sendHSCommand(); - sendHSStatusCommand(); + sendQueryHSValueCommand(); + sendSetHSThresholdCommand(); // 8对射报警 - sendDSStatusCommand(); +// sendDSStatusCommand(); // 9液位报警 - sendYWStatusCommand(); +// sendYWStatusCommand(); //10巡检数据同步 synchAssetInSpection(); @@ -82,56 +98,10 @@ * * @param client */ - private void sendWSCommand() { + private void sendQueryWSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_WS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询温湿度报警状态命令 - * @param client - */ - private void sendWSStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadWSStatusTask(), 25, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷监测值命令 - * - * @param client - */ - private void sendCH4Command() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询甲烷报警状态命令 - * @param client - */ - private void sendCH4StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCH4StatusTask(), 15, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳监测值命令 - * - * @param client - */ - private void sendCOCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendCOStatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadCOStatusTask(), 35, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadWSValueTask(), 20, interval * 60, TimeUnit.SECONDS); } /** @@ -139,18 +109,10 @@ * * @param client */ - private void sendO2Command() { + private void sendQueryO2ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_O2_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, 600, TimeUnit.SECONDS); - } - - /** - * 发送查询一氧化碳报警状态命令 - * @param client - */ - private void sendO2StatusCommand() { - ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadO2StatusTask(), 45, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadO2ValueTask(), 40, interval * 60, TimeUnit.SECONDS); } /** @@ -158,18 +120,77 @@ * * @param client */ - private void sendHSCommand() { + private void sendQueryHSValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_HS_VALUE_INTERVAL", "60")); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new ReadHSValueTask(), 50, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + private void sendQueryCH4ValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CH4_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(), 10, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询一氧化碳监测值命令 + * + * @param client + */ + private void sendQueryCOValueCommand() { + int interval = Integer.parseInt(Configure.getProperty("sys", "READ_CO_VALUE_INTERVAL", "60")); + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadCOValueTask(), 30, interval * 60, TimeUnit.SECONDS); + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + private void sendSetWSThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetWSThresholdTask(), 25, 1440, TimeUnit.MINUTES); // 每日重置所有设备的温湿度阈值 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + private void sendSetCH4ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCH4ThresholdTask(), 15, 1440, TimeUnit.MINUTES); // 每日重置所有设备的甲烷浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetCOThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetCOThresholdTask(), 35, 1440, TimeUnit.MINUTES); // 每日重置所有设备的一氧化碳浓度阈值 + } + + /** + * 发送查询一氧化碳报警状态命令 + * @param client + */ + private void sendSetO2ThresholdCommand() { + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new SetO2ThresholdTask(), 45, 1440, TimeUnit.MINUTES); // 每日重置所有设备的氧气浓度阈值 } /** * 发送查询硫化氢报警状态命令 * @param client */ - private void sendHSStatusCommand() { + private void sendSetHSThresholdCommand() { ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.scheduleWithFixedDelay(new ReadHSStatusTask(), 55, 600, TimeUnit.SECONDS); + sche.scheduleWithFixedDelay(new SetHSThresholdTask(), 55, 1440, TimeUnit.MINUTES); // 每日重置所有设备的硫化氢浓度阈值 } /** diff --git a/src/com/szpg/plc/message/command/WriteMemoryCommand.java b/src/com/szpg/plc/message/command/WriteMemoryCommand.java index a2d717e..201d9c5 100644 --- a/src/com/szpg/plc/message/command/WriteMemoryCommand.java +++ b/src/com/szpg/plc/message/command/WriteMemoryCommand.java @@ -1,59 +1,118 @@ -package com.szpg.plc.message.command; - -import com.szpg.plc.message.AppCommand; - -public abstract class WriteMemoryCommand extends AppCommand { - - /** - * - */ - private static final long serialVersionUID = -1083680357338083535L; - - private byte memoryArea; //写的内存区域代码 - private String startAddress; //起始地址 - private int count; //写的字数量/1WORD=2BYTE - private int bit; // 要写的位 - private byte[] value; //要写入的内容 - - public byte getMemoryArea() { - return memoryArea; - } - - public void setMemoryArea(byte memoryArea) { - this.memoryArea = memoryArea; - } - - public String getStartAddress() { - return startAddress; - } - - public void setStartAddress(String startAddress) { - this.startAddress = startAddress; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getBit() { - return bit; - } - - public void setBit(int bit) { - this.bit = bit; - } - - public byte[] getValue() { - return value; - } - - public void setValue(byte[] value) { - this.value = value; - } - - public abstract String getCommandType(); -} +package com.szpg.plc.message.command; + +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; + +public abstract class WriteMemoryCommand extends AppCommand { + + /** + * + */ + private static final long serialVersionUID = -1083680357338083535L; + + private byte memoryArea; //写的内存区域代码 + private String startAddress; //起始地址 + private int count; //写的字数量/1WORD=2BYTE + private int bit; // 要写的位 + private byte[] value; //要写入的内容 + + public byte getMemoryArea() { + return memoryArea; + } + + public void setMemoryArea(byte memoryArea) { + this.memoryArea = memoryArea; + } + + public String getStartAddress() { + return startAddress; + } + + public void setStartAddress(String startAddress) { + this.startAddress = startAddress; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getBit() { + return bit; + } + + public void setBit(int bit) { + this.bit = bit; + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + public static WriteMemoryCommand getInstance(String type) { + switch (type) { +// case AppMessageConstants.CMD_TYPE_READCH4VALUE: +// return new ReadCH4ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCH4STATUS: +// return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD: + return new SetWdThresholdWordCommand(); + case AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD: + return new SetSdThresholdWordCommand(); + +// case AppMessageConstants.CMD_TYPE_READCOVALUE: +// return new ReadCOValueCommand(); +// case AppMessageConstants.CMD_TYPE_READCOSTATUS: +// return new ReadCOStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READO2VALUE: +// return new ReadO2ValueCommand(); +// case AppMessageConstants.CMD_TYPE_READO2STATUS: +// return new ReadO2StatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READHSVALUE: +// return new ReadHSValueCommand(); +// case AppMessageConstants.CMD_TYPE_READHSSTATUS: +// return new ReadHSStatusCommand(); + +// case AppMessageConstants.CMD_TYPE_READYWSTATUS: +// return new ReadYWStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READDSSTATUS: +// return new ReadDSStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READJGSTATUS: +// return new ReadJgStatusCommand(); +// +// case AppMessageConstants.CMD_TYPE_READFJSTAT: +// return new ReadFjStatCommand(); +// case AppMessageConstants.CMD_TYPE_READFJRUNTIME: +// return new ReadFjRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READSBSTAT: +// return new ReadSbStatCommand(); +// case AppMessageConstants.CMD_TYPE_READSBRUNTIME: +// return new ReadSbRtCommand(); +// +// case AppMessageConstants.CMD_TYPE_READZMSTAT: +// return new ReadZmStatCommand(); +// case AppMessageConstants.CMD_TYPE_READZMRUNTIME: +// return new ReadZmRtCommand(); + + default: + return null; + } + } + + public abstract String getCommandType(); +} diff --git a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java index c6b0e18..8fa02ca 100644 --- a/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java +++ b/src/com/szpg/plc/message/response/ReadMemoryCommandResponse.java @@ -1,12 +1,60 @@ -package com.szpg.plc.message.response; - -import com.szpg.plc.message.CommandResponse; - -public abstract class ReadMemoryCommandResponse extends CommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6832502645108837925L; - -} +package com.szpg.plc.message.response; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +public abstract class ReadMemoryCommandResponse extends CommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6832502645108837925L; + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + /** + * 解析温度值 + * @param zcbh + * @param start + * @param messageData + * @return + */ + public float getValueFromData(String zcbh, int start, byte[] messageData, String blbh) { + float value = 0.0f; + + PgHjsbbl blObj = blDao.findBlByBh(blbh); + if (null == blObj) { + logger.warn("没有在数据库中找到变量[" + blbh + "]"); + return value; + } + + int kszdz = blObj.getKszdz(); //开始字地址 + int jszdz = blObj.getJszdz(); //结束字地址 + int n = jszdz - (kszdz - 1); //字数 + int offset = kszdz - start; //与开始字的偏移量 + + Bytes valueBytes = new Bytes(); + for (int j = n; j > 0; j--) { + valueBytes.append(new byte[] {messageData[(offset + j - 1) * 2], messageData[(offset + j - 1) * 2 + 1]}); + } + + try { + value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //变量值 + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("解析变量值[" + blbh + "]异常" + ex); + } + + logger.debug("解析变量值[" + blbh + "]" + value); + return value; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index 41d3b22..1211dc1 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = jwnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder jwsb = new StringBuilder(); - jwsb.append("tableName=HJSBBLZB"); - jwsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - jwsb.append("&Ent.ZCBH=").append(zcbh); - jwsb.append("&Ent.BLZ=").append(jwnd.get(i)); - jwsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String jwsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", jwsb.toString()); - - logger.info(jwsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 甲烷浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步甲烷报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断甲烷浓度值是否有变化 + double lastValue = ch4Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步甲烷浓度值结果:" + jwResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取甲烷浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析甲烷浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析甲烷浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //甲烷浓度值 - - // 解析甲烷浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //甲烷报警阈值 + // 2解析甲烷浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); + + logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取甲烷浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index c9b0d2e..8917035 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCODao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCODaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,80 @@ // 1将一氧化碳浓度数据存入数据库 PgCODao coDao = new PgCODaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历一氧化碳设备列表,将一氧化碳浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = cond.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder cosb = new StringBuilder(); - cosb.append("tableName=HJSBBLZB"); - cosb.append("&Ent.BLBH=").append(zcbh + ".Value"); - cosb.append("&Ent.ZCBH=").append(zcbh); - cosb.append("&Ent.BLZ=").append(cond.get(i)); - cosb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String cosr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", cosb.toString()); - - logger.info(cosr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",一氧化碳浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + jwResp); + } + + + // (二)如果监测值有变化则推送 + // 判断一氧化碳浓度值是否有变化 + double lastValue = coDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +154,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取一氧化碳浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +163,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU一氧化碳监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CO.START")); @@ -126,45 +178,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析一氧化碳浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析一氧化碳浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //一氧化碳浓度值 - - // 解析一氧化碳浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //一氧化碳报警阈值 + // 2解析一氧化碳浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getCond().add(value); getColdbjz().add(threshold); + + logger.info("[" + zcbh + "][一氧化碳浓度值" + value + "][一氧化碳浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取一氧化碳浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java index 0b65587..e539255 100644 --- a/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadFjStatCommandResponse.java @@ -16,7 +16,6 @@ import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadFjStatCommandResponse extends ReadMemoryCommandResponse { @@ -73,8 +72,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - + logger.info("风机[" + zcbh + "][运行状态" + fjRun.get(i) + "][风机故障" + fjFlt.get(i) + "]"); +// fjDao.addStatRecord(fjRun.get(i), fjFlt.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); fjDao.updateDeviceStatus(id, fjRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index ca71081..320a521 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHSDao; -import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHSDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将硫化氢浓度数据存入数据库 PgHSDao hsDao = new PgHSDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = hsnd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >=0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder hssb = new StringBuilder(); - hssb.append("tableName=HJSBBLZB"); - hssb.append("&Ent.BLBH=").append(zcbh + ".Value"); - hssb.append("&Ent.ZCBH=").append(zcbh); - hssb.append("&Ent.BLZ=").append(hsnd.get(i)); - hssb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String hssr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", hssb.toString()); - - logger.info(hssr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double high = 0.0; + try { + if (null != rule) { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 一氧化碳浓度超过高限阈值 + if (high > 0.0001 && value > high) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",硫化氢浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断硫化氢浓度值是否有变化 + double lastValue = hsDao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + + // (三)如果监测值没有变化 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + coResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取硫化氢浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU硫化氢监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".HS.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析硫化氢浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析硫化氢浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //硫化氢浓度值 - - // 解析硫化氢浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //硫化氢报警阈值 - + // 2解析硫化氢浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); + getHsnd().add(value); getHsldbjz().add(threshold); + + logger.info("[" + zcbh + "][硫化氢浓度值" + value + "][硫化氢浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取硫化氢浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 8a31f6e..16e0349 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; -import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgO2DaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.dao.PgO2Dao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgO2DaoImpl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { @@ -68,30 +70,79 @@ // 1将氧气浓度数据存入数据库 PgO2Dao o2Dao = new PgO2DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + float value = o2nd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder yqsb = new StringBuilder(); - yqsb.append("tableName=HJSBBLZB"); - yqsb.append("&Ent.BLBH=").append(zcbh + ".Value"); - yqsb.append("&Ent.ZCBH=").append(zcbh); - yqsb.append("&Ent.BLZ=").append(o2nd.get(i)); - yqsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String yqsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", yqsb.toString()); - - logger.info(yqsr); + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double low = 0.0; + try { + if (null != rule) { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); } + + // 氧气浓度低于低限阈值 + if (low > 0.0001 && value < low) { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarm_date(this.getTime().getTime()); + alarm.setAlarm_value(NumberFormat.format(value, "0.00")); + alarm.setAlarmdevid(deviceId); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + alarmDao.insertAlarmRecord(alarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = alarm.getDescription() + ",氧气浓度值为" + value; + String bjsj = date.replace("-", ""); + String jwbjResp = DataPushInterface.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 将报警值推送至市级平台 + String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + jwResp); + } + + // (二)如果监测值有变化则推送 + // 判断氧气浓度值是否有变化 + double lastValue = o2Dao.findLastValueByDevice(deviceId); + if (Math.abs(value - lastValue) > 0.01) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -102,6 +153,8 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取氧气浓度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); @@ -109,8 +162,6 @@ return; } - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - // 获取目标ACU氧气监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".YQ.START")); @@ -126,45 +177,19 @@ for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - // 解析氧气浓度监测值 - PgHjsbbl valueBlObj = blDao.findBlByBh(zcbh + ".Value"); - if (null == valueBlObj) { - continue; - } + // 1解析氧气浓度监测值 + float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); - int vkszdz = valueBlObj.getKszdz(); //开始字地址 - int vjszdz = valueBlObj.getJszdz(); //结束字地址 - int vn = vjszdz - (vkszdz - 1); //字数 - int voffset = vkszdz - start; //与开始字的偏移量 - - Bytes valueBytes = new Bytes(); - for (int j = vn; j > 0; j--) { - valueBytes.append(new byte[] {messageData[(voffset + j - 1) * 2], messageData[(voffset + j - 1) * 2 + 1]}); - } - - float value = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueBytes.toBytes()), 16)); //氧气浓度值 - - // 解析氧气浓度报警阈值 - PgHjsbbl thresholdBlObj = blDao.findBlByBh(zcbh + ".Set"); - if (null == thresholdBlObj) { - continue; - } - - int tkszdz = thresholdBlObj.getKszdz(); //开始字地址 - int tjszdz= thresholdBlObj.getJszdz(); //结束字地址 - int tn = tjszdz - (tkszdz - 1); //字数 - int toffset = tkszdz - start; //与开始字的偏移量 - - Bytes thresholdBytes = new Bytes(); - for (int k = tn; k > 0; k--) { - thresholdBytes.append(new byte[] {messageData[(toffset + k - 1) * 2], messageData[(toffset + k - 1) * 2 + 1]}); - } - - float threshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdBytes.toBytes()), 16)); //氧气报警阈值 + // 2解析氧气浓度报警阈值 + float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getO2nd().add(value); getO2ldbjz().add(threshold); + + logger.info("[" + zcbh + "][氧气浓度值" + value + "][氧气浓度报警阈值" + threshold + "]"); } + + logger.info("解析[读取氧气浓度值]响应指令结束"); } } diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 31ff51a..0d0f33f 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -7,18 +7,20 @@ import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import com.szpg.db.dao.PgAlarmDao; +import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgAlarmDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; -import com.szpg.db.data.PgHjsbbl; +import com.szpg.db.data.PgAlarm; +import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; -import com.szpg.util.HttpRequest; +import com.szpg.util.DataPushInterface; +import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { @@ -88,40 +90,129 @@ // 1将温湿度监测值数据存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历温湿度设备列表,将温湿度浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; - int id = deviceDao.findDeviceIdByCode(zcbh); - if (id > 0) { - wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - - // 推送至上级平台 - // TODO 代码待优化 - if (getTime().get(Calendar.MINUTE) >= 0 || getTime().get(Calendar.MINUTE) < 10) { - StringBuilder wdsb = new StringBuilder(); - wdsb.append("tableName=HJSBBLZB"); - wdsb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); - wdsb.append("&Ent.ZCBH=").append(zcbh); - wdsb.append("&Ent.BLZ=").append(wd.get(i)); - wdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String wdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", wdsb.toString()); - - StringBuilder sdsb = new StringBuilder(); - sdsb.append("tableName=HJSBBLZB"); - sdsb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); - sdsb.append("&Ent.ZCBH=").append(zcbh); - sdsb.append("&Ent.BLZ=").append(sd.get(i)); - sdsb.append("&Ent.SJC=").append(TimeFormat.format(getTime().getTime(), "yyyyMMddHHmmss")); - - String sdsr = HttpRequest.sendPostByHttp("http://10.10.2.19:9056/GLTHXC/api/Common/AddData", sdsb.toString()); - - logger.info(wdsr); - logger.info(sdsr); + float wdValue = wd.get(i); + float sdValue = sd.get(i); + + int deviceId = deviceDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + try { + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + } catch (Exception ex) { + logger.error("添加温湿度监测记录异常"); } + + // (一)如果有报警则立即推送 + // 判断是否超过报警阈值 + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + if (null != rule) { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + // 温度超过高限阈值 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + PgAlarm wdAlarm = new PgAlarm(); + wdAlarm.setActive(1); + wdAlarm.setAlarm_date(this.getTime().getTime()); + wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); + wdAlarm.setAlarmdevid(deviceId); + wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + wdAlarm.setDescription("温度超过高限阈值"); + wdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(wdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = wdAlarm.getDescription() + ",温度值为" + wdValue; + String bjsj = date.replace("-", ""); + String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步温度报警记录日志结果:" + wdbjResp); + + // 将报警值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + + // 湿度超过高限阈值 + if (sdHigh > 0.0001 && sdValue > sdHigh) { + PgAlarm sdAlarm = new PgAlarm(); + sdAlarm.setActive(1); + sdAlarm.setAlarm_date(this.getTime().getTime()); + sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); + sdAlarm.setAlarmdevid(deviceId); + sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + sdAlarm.setDescription("湿度超过高限阈值"); + sdAlarm.setUserid(null); + + alarmDao.insertAlarmRecord(sdAlarm); + + // 将报警日志推送至市级平台 + String date = TimeFormat.formatDate(getTime().getTime()); + int count = alarmDao.findAlarmCountByDate(date); + String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); + String bjms = sdAlarm.getDescription() + ",湿度值为" + sdValue; + String bjsj = date.replace("-", ""); + String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步湿度报警记录日志结果:" + sdbjResp); + + // 将报警值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + + // (二)如果监测值有变化则推送 + // 判断温度值是否有变化 + double lastTemp = wsDao.findLastTempByDevice(deviceId); + if (Math.abs(wdValue - lastTemp) > 0.01) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + } + + // 判断湿度值是否有变化 + double lastHum = wsDao.findLastHumByDevice(deviceId); + if (Math.abs(sdValue - lastHum) > 0.01) { + // 将监测值推送至市级平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + + // (三)如果监测值有变化则推送 + // 每天小时各推送一个数据 + int minute = Calendar.getInstance().get(Calendar.MINUTE); + if (minute < 10) { + // 将监测值推送至市级平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + } + } else { + logger.warn("未找到资产[" + zcbh + "]"); } } } @@ -132,15 +223,15 @@ // 获取目标ACU的代码 String acucode = this.getAcucode(); + logger.info("开始解析[读取温湿度值][" + acucode + "]指令响应"); + // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } - - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - + // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WS.START")); @@ -157,84 +248,26 @@ String zcbh = zcList[i]; // 1解析温度监测值 - PgHjsbbl valueTemBlObj = blDao.findBlByBh(zcbh + ".TemValue"); - if (null == valueTemBlObj) { - continue; - } - - int vwkszdz = valueTemBlObj.getKszdz(); //开始字地址 - int vwjszdz = valueTemBlObj.getJszdz(); //结束字地址 - int vwn = vwjszdz - (vwkszdz - 1); //字数 - int vwoffset = vwkszdz - start; //与开始字的偏移量 - - Bytes valueTemBytes = new Bytes(); - for (int j = vwn; j > 0; j--) { - valueTemBytes.append(new byte[] {messageData[(vwoffset + j - 1) * 2], messageData[(vwoffset + j - 1) * 2 + 1]}); - } - - float valueTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueTemBytes.toBytes()), 16)); //温度监测值 - + float valueTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemValue"); // 2解析湿度监测值 - PgHjsbbl valueWetBlObj = blDao.findBlByBh(zcbh + ".WetValue"); - if (null == valueWetBlObj) { - continue; - } - - int vskszdz = valueWetBlObj.getKszdz(); //开始字地址 - int vsjszdz = valueWetBlObj.getJszdz(); //结束字地址 - int vsn = vsjszdz - (vskszdz - 1); //字数 - int vsoffset = vskszdz - start; //与开始字的偏移量 - - Bytes valueWetBytes = new Bytes(); - for (int j = vsn; j > 0; j--) { - valueWetBytes.append(new byte[] {messageData[(vsoffset + j - 1) * 2], messageData[(vsoffset + j - 1) * 2 + 1]}); - } - - float valueWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(valueWetBytes.toBytes()), 16)); //湿度监测值 + float valueWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetValue"); // 3解析温度报警阈值 - PgHjsbbl thresholdTemBlObj = blDao.findBlByBh(zcbh + ".TemSet"); - if (null == thresholdTemBlObj) { - continue; - } - - int twkszdz = thresholdTemBlObj.getKszdz(); //开始字地址 - int twjszdz= thresholdTemBlObj.getJszdz(); //结束字地址 - int twn = twjszdz - (twkszdz - 1); //字数 - int twoffset = twkszdz - start; //与开始字的偏移量 - - Bytes thresholdTemBytes = new Bytes(); - for (int k = twn; k > 0; k--) { - thresholdTemBytes.append(new byte[] {messageData[(twoffset + k - 1) * 2], messageData[(twoffset + k - 1) * 2 + 1]}); - } - - float thresholdTem = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdTemBytes.toBytes()), 16)); //温度报警阈值 - + float threshTem = getValueFromData(zcbh, start, messageData, zcbh + ".TemSet"); // 4解析湿度报警阈值 - PgHjsbbl thresholdWetBlObj = blDao.findBlByBh(zcbh + ".WetSet"); - if (null == thresholdWetBlObj) { - continue; - } - - int tskszdz = thresholdWetBlObj.getKszdz(); //开始字地址 - int tsjszdz= thresholdWetBlObj.getJszdz(); //结束字地址 - int tsn = tsjszdz - (tskszdz - 1); //字数 - int tsoffset = tskszdz - start; //与开始字的偏移量 - - Bytes thresholdWetBytes = new Bytes(); - for (int k = tsn; k > 0; k--) { - thresholdWetBytes.append(new byte[] {messageData[(tsoffset + k - 1) * 2], messageData[(tsoffset + k - 1) * 2 + 1]}); - } - - float thresholdWet = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(thresholdWetBytes.toBytes()), 16)); //湿度报警阈值 + float threshWet = getValueFromData(zcbh, start, messageData, zcbh + ".WetSet"); getWd().add(valueTem); getSd().add(valueWet); - getWdbjz().add(thresholdTem); - getSdbjz().add(thresholdWet); + getWdbjz().add(threshTem); + getSdbjz().add(threshWet); + + logger.info("[" + zcbh + "][温度值" + valueTem + "][湿度值" + valueWet + "][温度报警阈值" + threshTem + "][湿度报警阈值" + threshWet + "]"); } + + logger.info("解析[读取温湿度值]响应指令结束"); } - + } diff --git a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java index a6b7583..0dd0390 100644 --- a/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadZmStatCommandResponse.java @@ -7,16 +7,15 @@ import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.PgZmDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.dao.impl.PgZmDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; -import com.szpg.util.TimeFormat; public class ReadZmStatCommandResponse extends ReadMemoryCommandResponse { @@ -63,8 +62,8 @@ int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { - zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); - +// zmDao.addStatRecord(zmRun.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); + logger.info("照明[" + zcbh + "][运行状态" + zmRun.get(i) + "]"); zmDao.updateDeviceStatus(id, zmRun.get(i)); } } diff --git a/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java new file mode 100644 index 0000000..c45521b --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetSdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetSdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置湿度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java new file mode 100644 index 0000000..4de3662 --- /dev/null +++ b/src/com/szpg/plc/message/response/write/SetWdThresholdCommandResponse.java @@ -0,0 +1,23 @@ +package com.szpg.plc.message.response.write; + +import org.apache.log4j.Logger; + +import com.szpg.plc.message.response.WriteMemoryCommandResponse; + +public class SetWdThresholdCommandResponse extends WriteMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 9058890148964464602L; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public void afterAction() { + if (this.isSuccess() == true) { + logger.info("[" + this.getAcucode() + "]设置温度报警阈值成功"); + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 7ec43a6..c38a645 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -1,876 +1,889 @@ -package com.szpg.plc.protocol.fins; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.AppMessage; -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.UnKnownMessage; -import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.command.WriteMemoryCommand; -import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.WriteMemoryCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; -import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; -import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; -import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; -import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; -import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; -import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; -import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; -import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; -import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; -import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.fins.frame.FINSByteFrame; -import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; - -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; - } - - /** - * 将字节数组解析为收到的消息对象 - * - * @param byte[] byteMessage - * @return RecievedMessage - */ - public AppMessage bytesToMessage(byte[] byteMessage) { - - AppMessage received = null; - - FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); - if (!finsFrame.valid) { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - return received; - } - - // 根据不同字节内容,解析为各类型应用消息 - String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); - - // 握手消息的响应 - if (commandStr.equalsIgnoreCase("00000001")) { - received = bytesToLinkCommandResponse(finsFrame); - } - - // 读写命令的响应 - if (commandStr.equalsIgnoreCase("00000002")) { - String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); - String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 - - // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 - String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - - // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); - - if (commandCode.equalsIgnoreCase("0101")) { - // 读内存命令响应的解析 - if (null != cmd) { - // 3根据参数类型调用相应的方法进行解析 - switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4VALUE: - received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READWSVALUE: - received = bytesToReadWSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READWSSTATUS: - received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READCOVALUE: - received = bytesToReadCOValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READCOSTATUS: - received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READO2VALUE: - received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READO2STATUS: - received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READHSVALUE: - received = bytesToReadHSValueCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READHSSTATUS: - received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READYWSTATUS: - received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READDSSTATUS: - received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READFJSTAT: - received = bytesToReadFjStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READFJRUNTIME: - received = bytesToReadFjRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READSBSTAT: - received = bytesToReadSbStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READSBRUNTIME: - received = bytesToReadSbRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READZMSTAT: - received = bytesToReadZmStatCommandResponse(finsFrame, cmd); - break; - case AppMessageConstants.CMD_TYPE_READZMRUNTIME: - received = bytesToReadZmRtCommandResponse(finsFrame, cmd); - break; - - case AppMessageConstants.CMD_TYPE_READJGSTATUS: - received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); - break; - } - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - } - } else if (commandCode.equalsIgnoreCase("0102")) { - if (null != cmd) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 设置ACU代码 - wmcr.setAcucode(cmd.getDest_acu_code()); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); - } - - wmcr.setCmdId(cmd.getId()); - wmcr.setCommandType(commandType); - - // 4将已响应的命令删除 - cmdDao.deleteCmdRecord(cmd.getId()); - - received = wmcr; - } - } - } else { - received = new UnKnownMessage(byteMessage); - received.setTime(Calendar.getInstance()); - } - - return received; - } - - - - /** - * 将握手响应字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { - LinkCommandResponse lcr = new LinkCommandResponse(); - - byte[] data = finsFrame.TEXT_DATA_BODY; - lcr.parseData(data); - - return lcr; - } - - /** - * 将查询甲烷参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } else { - rcvcr.setValid(false); - } - - return rcvcr; - } - - - /** - * 将查询甲烷报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } else { - rcscr.setValid(false); - } - - return rcscr; - } - - /** - * 将读取温湿度监测值响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); - - // 设置ACU代码 - rwvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwvcr.parseData(data); - - // 设置响应对应的命令ID - rwvcr.setCmdId(cmd.getId()); - } - - return rwvcr; - } - - - private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); - - // 设置ACU代码 - rwsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rwsscr.parseData(data); - - // 设置响应对应的命令ID - rwsscr.setCmdId(cmd.getId()); - } - - return rwsscr; - } - - - /** - * 将查询一氧化碳参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); - - // 设置ACU代码 - rcvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcvcr.parseData(data); - - // 设置响应对应的命令ID - rcvcr.setCmdId(cmd.getId()); - } - - return rcvcr; - } - - - /** - * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); - - // 设置ACU代码 - rcscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rcscr.parseData(data); - - // 设置响应对应的命令ID - rcscr.setCmdId(cmd.getId()); - } - - return rcscr; - } - - - /** - * 将查询氧气参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); - - // 设置ACU代码 - rovcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rovcr.parseData(data); - - // 设置响应对应的命令ID - rovcr.setCmdId(cmd.getId()); - } - - return rovcr; - } - - - /** - * 将查询氧气报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); - - // 设置ACU代码 - roscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - roscr.parseData(data); - - // 设置响应对应的命令ID - roscr.setCmdId(cmd.getId()); - } - - return roscr; - } - - - /** - * 将查询硫化氢参数响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); - - // 设置ACU代码 - rhvcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhvcr.parseData(data); - - // 设置响应对应的命令ID - rhvcr.setCmdId(cmd.getId()); - } - - return rhvcr; - } - - - /** - * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); - - // 设置ACU代码 - rhscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rhscr.parseData(data); - - // 设置响应对应的命令ID - rhscr.setCmdId(cmd.getId()); - } - - return rhscr; - } - - /** - * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); - - // 设置ACU代码 - ryscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - ryscr.parseData(data); - - // 设置响应对应的命令ID - ryscr.setCmdId(cmd.getId()); - } - - return ryscr; - } - - /** - * 将查询对射报警状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); - - // 设置ACU代码 - rdscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rdscr.parseData(data); - - // 设置响应对应的命令ID - rdscr.setCmdId(cmd.getId()); - } - - return rdscr; - } - - - /** - * 将查询风机运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); - - // 设置ACU代码 - rfscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfscr.parseData(data); - - // 设置响应对应的命令ID - rfscr.setCmdId(cmd.getId()); - } - - return rfscr; - } - - - /** - * 将读取风机运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); - - // 设置ACU代码 - rfrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rfrcr.parseData(data); - - // 设置响应对应的命令ID - rfrcr.setCmdId(cmd.getId()); - } - - return rfrcr; - } - - - /** - * 将查询水泵运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取水泵运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询照明运行状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); - - // 设置ACU代码 - rsscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsscr.parseData(data); - - // 设置响应对应的命令ID - rsscr.setCmdId(cmd.getId()); - } - - return rsscr; - } - - - /** - * 将读取照明运行时长响应字节数组转换为消息对象 - * - * @param finsFrame - * @return - */ - private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); - - // 设置ACU代码 - rsrcr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rsrcr.parseData(data); - - // 设置响应对应的命令ID - rsrcr.setCmdId(cmd.getId()); - } - - return rsrcr; - } - - - /** - * 将查询井盖状态响应消息字节数组转换为消息对象 - * - * @param byteMessage - * @return - */ - private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { - ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); - - // 设置ACU代码 - rjscr.setAcucode(cmd.getDest_acu_code()); - - byte[] body = finsFrame.TEXT_DATA_BODY; - rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - if (body[2] == 0x00 && body[3] == 0x00) { - // 正常返回 - byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - rjscr.parseData(data); - - // 设置响应对应的命令ID - rjscr.setCmdId(cmd.getId()); - } - - return rjscr; - } - - - /** - * 将消息对象解析为字节数组 - * - * @param SentMessage message - * @return byte[] - */ - public byte[] messageToBytes(AppMessage message) { - byte[] frame = null; - - // 握手命令 - if (message instanceof LinkCommand) { - frame = LinkCommandToBytes((LinkCommand) message); - } - - // 读内存命令 - if (message instanceof ReadMemoryCommand) { - frame = readMemoryCommandToBytes((ReadMemoryCommand) message); - } - - // 写内存命令 - if (message instanceof WriteMemoryCommand) { - frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); - } - - return frame; - } - - - - /** - * 将握手命令转换为字节数组 - * - * @param hmr - * @return - */ - private byte[] LinkCommandToBytes(LinkCommand link) { - FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); - - return finsFrame.toBytes(); - } - - /** - * 将读取PLC内存命令转换为字节数组 - * - * @param message - * @return - */ - private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将写PLC内存命令转换为字节数组 - * @param message - * @return - */ - private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { - if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { - // 按位操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getBit(), - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { - // 按字操作 - byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), - message.getMessageProducerId(), - message.getCommandType(), - message.getMemoryArea(), - start, - message.getCount(), - message.getValue()); - - return finsFrame.toBytes(); - } else { - return null; - } - } -} +package com.szpg.plc.protocol.fins; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessage; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.UnKnownMessage; +import com.szpg.plc.message.command.LinkCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.response.LinkCommandResponse; +import com.szpg.plc.message.response.WriteMemoryCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadFjRtCommandResponse; +import com.szpg.plc.message.response.read.ReadFjStatCommandResponse; +import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadJgStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadSbRtCommandResponse; +import com.szpg.plc.message.response.read.ReadSbStatCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadZmRtCommandResponse; +import com.szpg.plc.message.response.read.ReadZmStatCommandResponse; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.fins.frame.FINSByteFrame; +import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; + +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; + } + + /** + * 将字节数组解析为收到的消息对象 + * + * @param byte[] byteMessage + * @return RecievedMessage + */ + public AppMessage bytesToMessage(byte[] byteMessage) { + + AppMessage received = null; + + FINSByteFrame finsFrame = new FINSByteFrame(byteMessage); + if (!finsFrame.valid) { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + return received; + } + + // 根据不同字节内容,解析为各类型应用消息 + String commandStr = FINSByteFrameTool.getCommandStr(byteMessage); + + // 握手消息的响应 + if (commandStr.equalsIgnoreCase("00000001")) { + received = bytesToLinkCommandResponse(finsFrame); + } + + // 读写命令的响应 + if (commandStr.equalsIgnoreCase("00000002")) { + String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 + + // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 + String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 + + // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = cmdDao.findLatestCmdByDestAndType(dest, commandType); + + if (commandCode.equalsIgnoreCase("0101")) { + // 读内存命令响应的解析 + if (null != cmd) { + // 3根据参数类型调用相应的方法进行解析 + switch(commandType) { + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READCOVALUE: + received = bytesToReadCOValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READCOSTATUS: + received = bytesToReadCOStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READO2VALUE: + received = bytesToReadO2ValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READO2STATUS: + received = bytesToReadO2StatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READHSVALUE: + received = bytesToReadHSValueCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READHSSTATUS: + received = bytesToReadHSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READFJSTAT: + received = bytesToReadFjStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READFJRUNTIME: + received = bytesToReadFjRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READSBSTAT: + received = bytesToReadSbStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READSBRUNTIME: + received = bytesToReadSbRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READZMSTAT: + received = bytesToReadZmStatCommandResponse(finsFrame, cmd); + break; + case AppMessageConstants.CMD_TYPE_READZMRUNTIME: + received = bytesToReadZmRtCommandResponse(finsFrame, cmd); + break; + + case AppMessageConstants.CMD_TYPE_READJGSTATUS: + received = bytesToReadJgStatusCommandResponse(finsFrame, cmd); + break; + } + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + } + } else if (commandCode.equalsIgnoreCase("0102")) { + if (null != cmd) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 设置ACU代码 + wmcr.setAcucode(cmd.getDest_acu_code()); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + wmcr.setCmdId(cmd.getId()); + wmcr.setCommandType(commandType); + + // 4将已响应的命令删除 + cmdDao.deleteCmdRecord(cmd.getId()); + + received = wmcr; + } + } + } else { + received = new UnKnownMessage(byteMessage); + received.setTime(Calendar.getInstance()); + } + + return received; + } + + + + /** + * 将握手响应字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { + LinkCommandResponse lcr = new LinkCommandResponse(); + + byte[] data = finsFrame.TEXT_DATA_BODY; + lcr.parseData(data); + + return lcr; + } + + /** + * 将查询甲烷参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4ValueCommandResponse rcvcr = new ReadCH4ValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } else { + rcvcr.setValid(false); + } + + return rcvcr; + } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } else { + rcscr.setValid(false); + } + + return rcscr; + } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + // 设置ACU代码 + rwvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwvcr.parseData(data); + + // 设置响应对应的命令ID + rwvcr.setCmdId(cmd.getId()); + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + // 设置ACU代码 + rwsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rwsscr.parseData(data); + + // 设置响应对应的命令ID + rwsscr.setCmdId(cmd.getId()); + } + + return rwsscr; + } + + + /** + * 将查询一氧化碳参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOValueCommandResponse rcvcr = new ReadCOValueCommandResponse(); + + // 设置ACU代码 + rcvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcvcr.parseData(data); + + // 设置响应对应的命令ID + rcvcr.setCmdId(cmd.getId()); + } + + return rcvcr; + } + + + /** + * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadCOStatusCommandResponse rcscr = new ReadCOStatusCommandResponse(); + + // 设置ACU代码 + rcscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rcscr.parseData(data); + + // 设置响应对应的命令ID + rcscr.setCmdId(cmd.getId()); + } + + return rcscr; + } + + + /** + * 将查询氧气参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2ValueCommandResponse rovcr = new ReadO2ValueCommandResponse(); + + // 设置ACU代码 + rovcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rovcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rovcr.parseData(data); + + // 设置响应对应的命令ID + rovcr.setCmdId(cmd.getId()); + } + + return rovcr; + } + + + /** + * 将查询氧气报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadO2StatusCommandResponse roscr = new ReadO2StatusCommandResponse(); + + // 设置ACU代码 + roscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + roscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + roscr.parseData(data); + + // 设置响应对应的命令ID + roscr.setCmdId(cmd.getId()); + } + + return roscr; + } + + + /** + * 将查询硫化氢参数响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSValueCommandResponse rhvcr = new ReadHSValueCommandResponse(); + + // 设置ACU代码 + rhvcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhvcr.parseData(data); + + // 设置响应对应的命令ID + rhvcr.setCmdId(cmd.getId()); + } + + return rhvcr; + } + + + /** + * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadHSStatusCommandResponse rhscr = new ReadHSStatusCommandResponse(); + + // 设置ACU代码 + rhscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rhscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rhscr.parseData(data); + + // 设置响应对应的命令ID + rhscr.setCmdId(cmd.getId()); + } + + return rhscr; + } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + // 设置ACU代码 + ryscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + ryscr.parseData(data); + + // 设置响应对应的命令ID + ryscr.setCmdId(cmd.getId()); + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + // 设置ACU代码 + rdscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rdscr.parseData(data); + + // 设置响应对应的命令ID + rdscr.setCmdId(cmd.getId()); + } + + return rdscr; + } + + + /** + * 将查询风机运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjStatCommandResponse rfscr = new ReadFjStatCommandResponse(); + + // 设置ACU代码 + rfscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfscr.parseData(data); + + // 设置响应对应的命令ID + rfscr.setCmdId(cmd.getId()); + } + + return rfscr; + } + + + /** + * 将读取风机运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadFjRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadFjRtCommandResponse rfrcr = new ReadFjRtCommandResponse(); + + // 设置ACU代码 + rfrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rfrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rfrcr.parseData(data); + + // 设置响应对应的命令ID + rfrcr.setCmdId(cmd.getId()); + } + + return rfrcr; + } + + + /** + * 将查询水泵运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbStatCommandResponse rsscr = new ReadSbStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取水泵运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadSbRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadSbRtCommandResponse rsrcr = new ReadSbRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询照明运行状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmStatCommandResponse rsscr = new ReadZmStatCommandResponse(); + + // 设置ACU代码 + rsscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsscr.parseData(data); + + // 设置响应对应的命令ID + rsscr.setCmdId(cmd.getId()); + } + + return rsscr; + } + + + /** + * 将读取照明运行时长响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadZmRtCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadZmRtCommandResponse rsrcr = new ReadZmRtCommandResponse(); + + // 设置ACU代码 + rsrcr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rsrcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rsrcr.parseData(data); + + // 设置响应对应的命令ID + rsrcr.setCmdId(cmd.getId()); + } + + return rsrcr; + } + + + /** + * 将查询井盖状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame, PgAcuCmd cmd) { + ReadJgStatusCommandResponse rjscr = new ReadJgStatusCommandResponse(); + + // 设置ACU代码 + rjscr.setAcucode(cmd.getDest_acu_code()); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rjscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + rjscr.parseData(data); + + // 设置响应对应的命令ID + rjscr.setCmdId(cmd.getId()); + } + + return rjscr; + } + + + /** + * 将消息对象解析为字节数组 + * + * @param SentMessage message + * @return byte[] + */ + public byte[] messageToBytes(AppMessage message) { + byte[] frame = null; + + // 握手命令 + if (message instanceof LinkCommand) { + frame = LinkCommandToBytes((LinkCommand) message); + } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } + + // 写内存命令 + if (message instanceof WriteMemoryCommand) { + frame = writeMemoryCommandToBytes((WriteMemoryCommand) message); + } + + return frame; + } + + + + /** + * 将握手命令转换为字节数组 + * + * @param hmr + * @return + */ + private byte[] LinkCommandToBytes(LinkCommand link) { + FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); + + return finsFrame.toBytes(); + } + + /** + * 将读取PLC内存命令转换为字节数组 + * + * @param message + * @return + */ + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); + } + + /** + * 将写PLC内存命令转换为字节数组 + * @param message + * @return + */ + private byte[] writeMemoryCommandToBytes(WriteMemoryCommand message) { + if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_BIT) { + // 按位操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 2); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getBit(), + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_WORK_AREA_WORD) { + // 按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else if (message.getMemoryArea() == FINSConstants.MEMORY_DM_AREA) { + // 写D区,按字操作 + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); + + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getCommandType(), + message.getMemoryArea(), + start, + message.getCount(), + message.getValue()); + + return finsFrame.toBytes(); + } else { + return null; + } + } +} diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index 40ab958..3d40dc1 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -1,93 +1,97 @@ -package com.szpg.plc.server; - -import com.szpg.plc.util.ByteUtil; -import io.netty.buffer.Unpooled; -import org.apache.log4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class ACUClientUtil { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - public static final Logger recv = Logger.getLogger("recv"); - public static final Logger send = Logger.getLogger("send"); - - private static ACUClientUtil util = null; - - private Map clients; - - public ACUCommandResponsePool responsePool; - - private ACUClientUtil() { - responsePool = new ACUCommandResponsePool(); - clients = new ConcurrentHashMap(); - } - - public static ACUClientUtil getInstance() { - if (null == util) - util = new ACUClientUtil(); - - return util; - } - - public Map getClients() { - return clients; - } - - public void setClients(Map clients) { - this.clients = clients; - } - - /** - * 将client添加到map中 - * @param client - */ - public void addClient(ACUClient client) { - clients.put(client.getKey(), client); - logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); - } - - /** - * 将client从map中移除 - * @param client - */ - public void removeClient(ACUClient client) { - if (clients.containsKey(client.getKey())) { - clients.remove(client.getKey()); - logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); - } - } - - /** - * 从map中查找client - * @param key - * @return - */ - public ACUClient getClient(String key) { - if (clients.containsKey(key)) - return clients.get(key); - else - return null; - } - - - /** - * 通过TCP连接向PLC端发送命令 - * - * @param client - * @param content - */ - public void sendACUCommand(ACUClient client, byte[] content) { - // 判断channel并发送消息 - if (null != client.getChannel() && client.getChannel().isActive() == true) { - // 通过socket发送消息并记录日志 - ACUClientUtil.send.info(ByteUtil.binToHexString(content)); - - client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); - } else { - logger.debug("与" + client + "的TCP连接未建立"); - } - } - +package com.szpg.plc.server; + +import com.szpg.plc.util.ByteUtil; +import io.netty.buffer.Unpooled; +import org.apache.log4j.Logger; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ACUClientUtil { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + public static final Logger recv = Logger.getLogger("recv"); + public static final Logger send = Logger.getLogger("send"); + + private static ACUClientUtil util = null; + + private Map clients; + + public ACUCommandResponsePool responsePool; + + private ACUClientUtil() { + responsePool = new ACUCommandResponsePool(); + clients = new ConcurrentHashMap(); + } + + public static ACUClientUtil getInstance() { + if (null == util) + util = new ACUClientUtil(); + + return util; + } + + public Map getClients() { + return clients; + } + + public void setClients(Map clients) { + this.clients = clients; + } + + /** + * 将client添加到map中 + * @param client + */ + public void addClient(ACUClient client) { + clients.put(client.getKey(), client); + logger.debug("添加到clients中" + client + "[++" + clients.size() + "]"); + } + + /** + * 将client从map中移除 + * @param client + */ + public void removeClient(ACUClient client) { + if (clients.containsKey(client.getKey())) { + clients.remove(client.getKey()); + logger.debug("从clients中移除" + client + "[--" + clients.size() + "]"); + } + } + + /** + * 从map中查找client + * @param key + * @return + */ + public ACUClient getClient(String key) { + if (clients.containsKey(key)) + return clients.get(key); + else + return null; + } + + + /** + * 通过TCP连接向PLC端发送命令 + * + * @param client + * @param content + */ + public void sendACUCommand(ACUClient client, byte[] content) { + // 判断channel并发送消息 + if (null != client.getChannel() && client.getChannel().isActive() == true) { + if (null != content && content.length > 0) { + // 通过socket发送消息并记录日志 + ACUClientUtil.send.info(ByteUtil.binToHexString(content)); + + client.getChannel().writeAndFlush(Unpooled.copiedBuffer(content)); + } else { + logger.debug("要发送的内容为空"); + } + } else { + logger.debug("与" + client + "的TCP连接未建立"); + } + } + } \ No newline at end of file diff --git a/src/com/szpg/rmi/RemoteControlCommandAction.java b/src/com/szpg/rmi/RemoteControlCommandAction.java index ced2303..a067a04 100644 --- a/src/com/szpg/rmi/RemoteControlCommandAction.java +++ b/src/com/szpg/rmi/RemoteControlCommandAction.java @@ -1,6 +1,7 @@ package com.szpg.rmi; -import java.net.URLEncoder; +import java.util.HashSet; +import java.util.Set; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -17,8 +18,6 @@ import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.write.SetDsRstBitCommand; -import com.szpg.plc.message.command.write.SetFjOffBitCommand; -import com.szpg.plc.message.command.write.SetFjOnBitCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -29,15 +28,19 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteControlCommandAction extends ActionSupport { + /** * */ private static final long serialVersionUID = -577795045445769331L; + + private Set eqsb = new HashSet(); //二期四标段风机所属舱段 private Logger logger = Logger.getLogger(this.getClass().getName()); @@ -45,6 +48,15 @@ private String jsoncallback; private String zcbh; + + public RemoteControlCommandAction() { + // 二期四标段风机控制 + eqsb.add("THXC.ACU801"); + eqsb.add("THXC.ACU802"); + eqsb.add("THXC.ACU803"); + eqsb.add("THXC.ACU804"); + eqsb.add("THXC.ACU806"); + } public String getZcbh() { return zcbh; @@ -85,7 +97,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -97,7 +109,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -152,7 +164,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -204,7 +216,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的开灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的开灯变量")); returnToFront(jResult); return null; @@ -239,7 +251,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -264,7 +276,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -272,7 +284,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -295,7 +307,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -306,7 +318,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -406,7 +418,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关灯变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关灯变量")); returnToFront(jResult); return null; @@ -441,7 +453,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -466,7 +478,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -474,7 +486,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -482,409 +494,7 @@ } - /** - * 远程打开排风机 - * @return - * @throws Exception - */ - public String trunOnFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将停止位置0 - SetFjOffBitCommand clearOffCmd = new SetFjOffBitCommand(); - clearOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - clearOffCmd.setMessageProducerId(sour); - clearOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - clearOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOffCmd.setBit(bit); - - // 位数 - clearOffCmd.setCount(end - start + 1); - - // 位内容 - clearOffCmd.setValue(new byte[] {(byte) clearOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送启动风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置启动位的命令 - SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); - setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - setOnCmd.setMessageProducerId(sour); - setOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOnCmd.setBit(bit); - - // 位数 - setOnCmd.setCount(end - start + 1); - - // 位内容 - setOnCmd.setValue(new byte[] {(byte) setOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的打开风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - /** - * 远程关闭排风机 - * @return - * @throws Exception - */ - public String turnOffFj() throws Exception { - // 返回结果 - JSONObject jResult = new JSONObject(); - - if (null == zcbh || zcbh.equals("") == true) { - jResult.put("success", false); - jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - PgAcu acu = acuDao.findACUByCode(acucode); - if (null == acu) { - jResult.put("success", false); - jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); - - returnToFront(jResult); - return null; - } - - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 1首先将启动位置0 - SetFjOnBitCommand clearOnCmd = new SetFjOnBitCommand(); - clearOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); - PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); - if (null != onBlObj) { - clearOnCmd.setMessageProducerId(sour); - clearOnCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - clearOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - int bit = onBlObj.getSzw(); - - // 开始字地址 - clearOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - clearOnCmd.setBit(bit); - - // 位数 - clearOnCmd.setCount(end - start + 1); - - // 位内容 - clearOnCmd.setValue(new byte[] {(byte) clearOnCmd.getFjon()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(clearOnCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 暂停1秒后发送关闭风机的命令 - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志 - logger.error("清除停止位后的阻塞等待线程被打断", e); - } - - // 2 发送设置停止位的命令 - SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); - setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); - PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); - if (null != offBlObj) { - setOffCmd.setMessageProducerId(sour); - setOffCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = offBlObj.getKszdz(); - int end = offBlObj.getJszdz(); - int bit = offBlObj.getSzw(); - - // 开始字地址 - setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setOffCmd.setBit(bit); - - // 位数 - setOffCmd.setCount(end - start + 1); - - // 位内容 - setOffCmd.setValue(new byte[] {(byte) setOffCmd.getFjoff()} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setOffCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } else { - jResult.put("success", false); - jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的关闭风机变量", "UTF-8")); - - returnToFront(jResult); - return null; - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); - - returnToFront(jResult); - return null; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); - - returnToFront(jResult); - return null; - } - } else { - jResult.put("success", false); - jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); - - returnToFront(jResult); - return null; - } - } /** @@ -899,7 +509,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -914,7 +524,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -969,7 +579,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的解锁井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; @@ -1004,7 +614,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1029,7 +639,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1037,7 +647,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1057,7 +667,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1072,7 +682,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1126,7 +736,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的锁定井盖变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的锁定井盖变量")); returnToFront(jResult); return null; @@ -1161,7 +771,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1186,7 +796,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1194,7 +804,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; @@ -1214,7 +824,7 @@ if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); - jResult.put("resaon", URLEncoder.encode("资产编号为空", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; @@ -1229,7 +839,7 @@ if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); - jResult.put("resaon", URLEncoder.encode("未找到资产对应的PLC主机", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; @@ -1283,7 +893,7 @@ } else { jResult.put("success", false); jResult.put("code", "4"); - jResult.put("reason", URLEncoder.encode("未找到资产对应的清除对射报警变量", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的清除对射报警变量")); returnToFront(jResult); return null; @@ -1318,7 +928,7 @@ jResult.put("success", false); jResult.put("code", "5"); - jResult.put("reason", URLEncoder.encode("查找命令的响应消息时异常", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); returnToFront(jResult); return null; @@ -1343,7 +953,7 @@ jResult.put("success", false); jResult.put("code", "6"); - jResult.put("reason", URLEncoder.encode("命令发送超时", "UTF-8")); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); returnToFront(jResult); return null; @@ -1351,7 +961,7 @@ } else { jResult.put("success", false); jResult.put("code", "3"); - jResult.put("resaon", URLEncoder.encode("PLC主机不在线", "UTF-8")); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java new file mode 100644 index 0000000..b0a1ed1 --- /dev/null +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.ExhaustFanCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteFJCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取风机实时状态 + * @return + * @throws Exception + */ + public String readFjStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READFJSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".FJSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开排风机 + * @return + * @throws Exception + */ + public String turnOnFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开风机指令 + SetFjOnBitCommand setOnCmd = ExhaustFanCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭排风机 + * @return + * @throws Exception + */ + public String turnOffFj() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetFjOffBitCommand setOffCmd = ExhaustFanCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java new file mode 100644 index 0000000..fb813fb --- /dev/null +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -0,0 +1,421 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.service.ReadSensorValueService; +import com.szpg.service.SetSensorThresholdService; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteWSCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String wdThreshold; + private String sdThreshold; + + private String format; + private String jsoncallback; + + + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getWdThreshold() { + return wdThreshold; + } + + public void setWdThreshold(String wdThreshold) { + this.wdThreshold = wdThreshold; + } + + public String getSdThreshold() { + return sdThreshold; + } + + public void setSdThreshold(String sdThreshold) { + this.sdThreshold = sdThreshold; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取温湿度实时监测值 + * @return + * @throws Exception + */ + public String readWSValue() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + + command.setDestinationId(dest); + + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + try { + // 设置读取的地址范围 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".WS.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadSensorValueService service = new ReadSensorValueService(); + service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); + } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置温度报警阈值 + * @return + * @throws Exception + */ + public String setWdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETWDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl temBlObj = blDao.findBlByBh(zcbh + ".TemSet"); + if (null != temBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(wdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, NumberFormat.parseDouble(wdThreshold, "0.00"), sdHigh); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 设置湿度报警阈值 + * @return + * @throws Exception + */ + public String setSdThreshold() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETSDTHRESHOLD); + + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + PgHjsbbl humBlObj = blDao.findBlByBh(zcbh + ".WetSet"); + if (null != humBlObj) { + // SID在new对象的时候已经生成 + + command.setMessageProducerId(sour); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + int start = humBlObj.getKszdz(); + int end = humBlObj.getJszdz(); + + // 开始字地址 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + command.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) NumberFormat.parseDouble(sdThreshold, "0.00"))); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + command.setValue( dataByte.toBytes() ); + ((SetSdThresholdWordCommand) command).setThreshold(Float.parseFloat(sdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(sdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); + + // 调用服务过程执行命令发送服务 + SetSensorThresholdService service = new SetSensorThresholdService(); + service.executeService(client, command); + Logger.getLogger(this.getClass().getName()).info(command); + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + // 修改数据库中的报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + + int deviceId = devDao.findDeviceIdByCode(zcbh); + if (deviceId > 0) { + PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + double wdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + } + + // 更新阈值 + ruleDao.updateWSHighThresholdByDevice(deviceId, wdHigh, NumberFormat.parseDouble(sdThreshold, "0.00")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应变量")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java new file mode 100644 index 0000000..6c736cd --- /dev/null +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -0,0 +1,436 @@ +package com.szpg.rmi; + +import org.apache.log4j.Logger; +import org.apache.struts2.ServletActionContext; + +import com.opensymphony.xwork2.ActionSupport; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.service.ReadControllerStatusService; +import com.szpg.service.command.LightCommandService; +import com.szpg.util.Configure; +import com.szpg.util.UnicodeConvertor; + +import z.json.JSONObject; + +public class RemoteZMCommandAction extends ActionSupport { + + /** + * + */ + private static final long serialVersionUID = 2221187086461756012L; + + private String zcbh; + + private String format; + private String jsoncallback; + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + public String getZcbh() { + return zcbh; + } + + public void setZcbh(String zcbh) { + this.zcbh = zcbh; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public String getJsoncallback() { + return jsoncallback; + } + + public void setJsoncallback(String jsoncallback) { + this.jsoncallback = jsoncallback; + } + + /** + * 读取照明实时状态 + * @return + * @throws Exception + */ + public String readZmStatus() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + PgAcuDao acuDao = new PgAcuDaoImpl(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READZMSTAT); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + command.setMessageProducerId(sour); + + String dest = client.getNet() + client.getNode() + client.getUnit(); + command.setDestinationId(dest); + command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 + + try { + // 设置读取的地址范围 + // 从配置文件读取而来 + command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.START")), 2)) + "00"); + command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".ZMSTAT.WORDCOUNT"))); + + // 调用服务过程执行命令发送服务 + ReadControllerStatusService service = new ReadControllerStatusService(); + service.executeService(client, command); + logger.info(command); + } catch (Exception ex) { + logger.error("发送查询照明指令异常" + ex); + } + + jResult.put("success", true); + jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); + + returnToFront(jResult); + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程打开照明 + * @return + * @throws Exception + */ + public String turnOnZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将停止位置0 + // 该逻辑取消,由设备自行控制 + + // 2 发送设置启动位的命令 + // 构建打开照明指令 + SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOnCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开风机变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOnCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOnCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + /** + * 远程关闭照明 + * @return + * @throws Exception + */ + public String turnOffZm() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 1首先将启动位置0 + // 逻辑取消,由PLC设备自行控制 + + // 2 发送设置停止位的命令 + SetZmOffBitCommand setOffCmd = LightCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setOffCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭照明变量")); + + returnToFront(jResult); + return null; + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setOffCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setOffCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "5"); + jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); + + returnToFront(jResult); + return null; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); + + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + returnToFront(jResult); + return null; + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + jResult.put("success", false); + jResult.put("code", "6"); + jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); + + returnToFront(jResult); + return null; + } + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 给前端返回 + * @param jResult + * @throws Exception + */ + private void returnToFront(JSONObject jResult) throws Exception { + // 返回jsonp格式的数据 + if (null != format && format.equalsIgnoreCase("jsonp") == true) { + ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); + } + + ServletActionContext.getResponse().getWriter().write(jResult.toString()); + } +} diff --git a/src/com/szpg/service/ReadSensorValueService.java b/src/com/szpg/service/ReadSensorValueService.java index ba33837..95c9397 100644 --- a/src/com/szpg/service/ReadSensorValueService.java +++ b/src/com/szpg/service/ReadSensorValueService.java @@ -1,94 +1,91 @@ -package com.szpg.service; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; - -/** - * 读取环境变量监测值的服务过程 - * - * @author admin - * - */ -public class ReadSensorValueService { - - private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - private PgAcuDao acuDao = new PgAcuDaoImpl(); - - public void executeService(ACUClient client, ReadMemoryCommand command) { - // 解析命令对象为字节数组 - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(command); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - // 1查找数据库中的ACU对象 - PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); - if (null == acu) { - return; - } - - // 2生成读取命令对象 - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(command.getCommandType()); - cmd.setDest_acu_code(acu.getAcu_code()); - cmd.setTm(command.getTime().getTime()); - - // 3将命令保存入数据库 - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 7如果监测值未发生变化则退出 - - // 8如果监测值发生变化则调用接口将变量值推送出去 - - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - -} +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 读取环境变量监测值的服务过程 + * + * @author admin + * + */ +public class ReadSensorValueService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, ReadMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/SetSensorThresholdService.java b/src/com/szpg/service/SetSensorThresholdService.java new file mode 100644 index 0000000..152f998 --- /dev/null +++ b/src/com/szpg/service/SetSensorThresholdService.java @@ -0,0 +1,91 @@ +package com.szpg.service; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; + +/** + * 设置环境变量报警阈值的服务过程 + * + * @author admin + * + */ +public class SetSensorThresholdService { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + private PgAcuDao acuDao = new PgAcuDaoImpl(); + + public void executeService(ACUClient client, WriteMemoryCommand command) { + // 解析命令对象为字节数组 + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(command); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + // 1查找数据库中的ACU对象 + PgAcu acu = acuDao.findACUByDest(command.getDestinationId()); + if (null == acu) { + return; + } + + // 2生成读取命令对象 + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(command.getCommandType()); + cmd.setDest_acu_code(acu.getAcu_code()); + cmd.setTm(command.getTime().getTime()); + + // 3将命令保存入数据库 + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + // 7如果监测值未发生变化则退出 + // 8如果监测值发生变化则调用接口将变量值推送出去 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + +} diff --git a/src/com/szpg/service/command/ExhaustFanCommandService.java b/src/com/szpg/service/command/ExhaustFanCommandService.java new file mode 100644 index 0000000..f05c818 --- /dev/null +++ b/src/com/szpg/service/command/ExhaustFanCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetFjOffBitCommand; +import com.szpg.plc.message.command.write.SetFjOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 风机控制指令辅助类 + * @author admin + * + */ +public class ExhaustFanCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetFjOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOnBitCommand setOnCmd = new SetFjOnBitCommand(); + setOnCmd.setFjon(SetFjOnBitCommand.FJ_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetFjOnBitCommand.FJ_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetFjOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭风机控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetFjOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetFjOffBitCommand setOffCmd = new SetFjOffBitCommand(); + setOffCmd.setFjoff(SetFjOffBitCommand.FJ_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetFjOffBitCommand.FJ_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/service/command/LightCommandService.java b/src/com/szpg/service/command/LightCommandService.java new file mode 100644 index 0000000..0071a0e --- /dev/null +++ b/src/com/szpg/service/command/LightCommandService.java @@ -0,0 +1,188 @@ +package com.szpg.service.command; + +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetZmOffBitCommand; +import com.szpg.plc.message.command.write.SetZmOnBitCommand; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.util.ByteUtil; + +/** + * 照明控制指令辅助类 + * @author admin + * + */ +public class LightCommandService { + + /** + * 根据资产编号构建打开风机控制指令 + * + * @param sour 源地址 + * @param dest 目的地址 + * @param zcbh 资产编号 + * @return + */ + public static SetZmOnBitCommand buildTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_ENABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_ENABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位打开照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOnBitCommand buildResetTurnOnCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOnBitCommand setOnCmd = new SetZmOnBitCommand(); + setOnCmd.setZmon(SetZmOnBitCommand.ZM_ON_DISABLE); + PgHjsbbl onBlObj = blDao.findBlByBh(zcbh + ".ON"); + if (null != onBlObj) { + setOnCmd.setMessageProducerId(sour); + setOnCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOnCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = onBlObj.getKszdz(); + int end = onBlObj.getJszdz(); + int bit = onBlObj.getSzw(); + + // 开始字地址 + setOnCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOnCmd.setBit(bit); + + // 位数 + setOnCmd.setCount(end - start + 1); + + // 位内容 + setOnCmd.setValue(new byte[] {(byte) SetZmOnBitCommand.ZM_ON_DISABLE} ); + + return setOnCmd; + } else { + return null; + } + } + + + public static SetZmOffBitCommand buildTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_ENABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_ENABLE} ); + + return setOffCmd; + } else { + return null; + } + } + + /** + * 根据资产编号构建复位关闭照明控制指令 + * @param sour + * @param dest + * @param zcbh + * @return + */ + public static SetZmOffBitCommand buildResetTurnOffCommand(String sour, String dest, String zcbh) { + PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + SetZmOffBitCommand setOffCmd = new SetZmOffBitCommand(); + setOffCmd.setZmoff(SetZmOffBitCommand.ZM_OFF_DISABLE); + PgHjsbbl offBlObj = blDao.findBlByBh(zcbh + ".OFF"); + if (null != offBlObj) { + setOffCmd.setMessageProducerId(sour); + setOffCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按位写 + setOffCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); + + int start = offBlObj.getKszdz(); + int end = offBlObj.getJszdz(); + int bit = offBlObj.getSzw(); + + // 开始字地址 + setOffCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); + + // 位地址 + setOffCmd.setBit(bit); + + // 位数 + setOffCmd.setCount(end - start + 1); + + // 位内容 + setOffCmd.setValue(new byte[] {SetZmOffBitCommand.ZM_OFF_DISABLE} ); + + return setOffCmd; + } else { + return null; + } + } +} diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 587b2bf..4b8ee8a 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询甲烷指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index ad7a9ae..c305e45 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询一氧化碳指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 0fd4530..73ca46f 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询硫化氢指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 37693db..a80b0c9 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -44,7 +46,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询氧气浓度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 3109c56..760e403 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.log4j.Logger; + import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; @@ -45,7 +47,9 @@ // 调用服务过程执行命令发送服务 service.executeService(client, (ReadMemoryCommand) command); + Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { + Logger.getLogger(getClass().getName()).error("发送查询温湿度指令异常" + ex); continue; } } diff --git a/src/com/szpg/task/SetCH4ThresholdTask.java b/src/com/szpg/task/SetCH4ThresholdTask.java index 5944f82..2dcf469 100644 --- a/src/com/szpg/task/SetCH4ThresholdTask.java +++ b/src/com/szpg/task/SetCH4ThresholdTask.java @@ -1,147 +1,136 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置甲烷报警阈值 - * - * @author admin - * - */ -public class SetCH4ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCH4ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCH4ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置甲烷报警阈值 + * + * @author admin + * + */ +public class SetCH4ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCH4ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的甲烷报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("甲烷检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正甲烷浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCH4ThresholdWordCommand setThreCmd = new SetCH4ThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正甲烷报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/task/SetCOThresholdTask.java b/src/com/szpg/task/SetCOThresholdTask.java index 0bc4ed9..94c656f 100644 --- a/src/com/szpg/task/SetCOThresholdTask.java +++ b/src/com/szpg/task/SetCOThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetCOThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetCOThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetCOThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetCOThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetCOThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的一氧化碳报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("一氧化碳检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正一氧化碳浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置甲烷浓度报警阈值 + SetCOThresholdWordCommand setThreCmd = new SetCOThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正一氧化碳报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetHSThresholdTask.java b/src/com/szpg/task/SetHSThresholdTask.java index 38b6861..bc57ae5 100644 --- a/src/com/szpg/task/SetHSThresholdTask.java +++ b/src/com/szpg/task/SetHSThresholdTask.java @@ -1,147 +1,139 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置硫化氢报警阈值 - * - * @author admin - * - */ -public class SetHSThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetHSThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置硫化氢报警阈值 + * + * @author admin + * + */ +public class SetHSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetHSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的硫化氢报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("硫化氢检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正硫化氢浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double high = 0.0; + try { + high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置硫化氢浓度报警阈值 + SetHSThresholdWordCommand setThreCmd = new SetHSThresholdWordCommand(); + setThreCmd.setThreshold((float) high); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) high)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正硫化氢报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetO2ThresholdTask.java b/src/com/szpg/task/SetO2ThresholdTask.java index 9bbfb20..abe856e 100644 --- a/src/com/szpg/task/SetO2ThresholdTask.java +++ b/src/com/szpg/task/SetO2ThresholdTask.java @@ -1,147 +1,138 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置氧气报警阈值 - * - * @author admin - * - */ -public class SetO2ThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetO2ThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); - setThreCmd.setThreshold(threshold); - PgHjsbbl onBlObj = blDao.findBlByBh(deviceCode + ".Set"); - if (null != onBlObj) { - setThreCmd.setMessageProducerId(sour); - setThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = onBlObj.getKszdz(); - int end = onBlObj.getJszdz(); - - // 开始字地址 - setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetO2ThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置氧气报警阈值 + * + * @author admin + * + */ +public class SetO2ThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetO2ThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的氧气报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("氧气检测仪"); + + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正氧气浓度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double low = 0.0; + try { + low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置氧气浓度报警阈值 + SetO2ThresholdWordCommand setThreCmd = new SetO2ThresholdWordCommand(); + setThreCmd.setThreshold((float) low); + PgHjsbbl tBlObj = blDao.findBlByBh(deviceCode + ".Set"); + if (null != tBlObj) { + setThreCmd.setMessageProducerId(sour); + setThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = tBlObj.getKszdz(); + int end = tBlObj.getJszdz(); + + // 开始字地址 + setThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) low)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正氧气报警阈值 定时任务"); + } + + } + +} diff --git a/src/com/szpg/task/SetSdThresholdTask.java b/src/com/szpg/task/SetSdThresholdTask.java index e0c8ac1..cab2da8 100644 --- a/src/com/szpg/task/SetSdThresholdTask.java +++ b/src/com/szpg/task/SetSdThresholdTask.java @@ -1,147 +1,144 @@ -package com.szpg.task; - -import org.apache.log4j.Logger; - -import com.szpg.db.dao.PgAcuCmdDao; -import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; -import com.szpg.db.dao.impl.PgAcuDaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.db.dao.impl.PgHjsbblDaoImpl; -import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; -import com.szpg.db.data.PgHjsbbl; -import com.szpg.plc.message.CommandResponse; -import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.protocol.fins.FINSConstants; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; -import com.szpg.plc.util.Bytes; -import com.szpg.util.Configure; - -/** - * 设置温湿度报警阈值 - * - * @author admin - * - */ -public class SetSdThresholdTask implements Runnable { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private String deviceCode; - private float threshold; - private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); - - public SetSdThresholdTask(String deviceCode, float threshold) { - this.deviceCode = deviceCode; - this.threshold = threshold; - } - - @Override - public void run() { - // 查找ACU的信息 - PgAcuDao acuDao = new PgAcuDaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - String acucode = deviceDao.findAcuCodeByCode(deviceCode); - PgAcu acu = acuDao.findACUByCode(acucode); - ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); - if (null != client) { - // 源地址 - String sour = Configure.getProperty("sys", "LOCALHOST.NET") + - Configure.getProperty("sys", "LOCALHOST.NODE") + - Configure.getProperty("sys", "LOCALHOST.UNIT"); - - // 目标地址 - String dest = client.getNet() + client.getNode() + client.getUnit(); - - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - // 发送设置报警阈值的命令 - SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); - setWetThreCmd.setThreshold(threshold); - PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); - if (null != wetBlObj) { - setWetThreCmd.setMessageProducerId(sour); - setWetThreCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按字写 - setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); - - int start = wetBlObj.getKszdz(); - int end = wetBlObj.getJszdz(); - - // 开始字地址 - setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); - - // 字数 - int n = end - start + 1; - setWetThreCmd.setCount(n); - - // 字内容 - byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); - Bytes dataByte = new Bytes(); - for (int j = n; j > 0; j--) { - dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); - } - setWetThreCmd.setValue( dataByte.toBytes() ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setWetThreCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setWetThreCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setWetThreCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // TODO 阻塞线程被打断,需要处理异常 - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - return; - } - } - - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - } - } - } - -} +package com.szpg.task; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuCmdDao; +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAcuCmd; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.CommandResponse; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetSdThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private String deviceCode; + private float threshold; + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetSdThresholdTask(String deviceCode, float threshold) { + this.deviceCode = deviceCode; + this.threshold = threshold; + } + + @Override + public void run() { + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置报警阈值的命令 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold(threshold); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits(threshold)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 3将命令存入数据库 + PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); + PgAcuCmd cmd = new PgAcuCmd(); + cmd.setCmd_type(setWetThreCmd.getCommandType()); + cmd.setDest_acu_code(acucode); + cmd.setTm(setWetThreCmd.getTime().getTime()); + cmdDao.addCmdRecord(cmd); + + // 4阻塞,循环查找响应消息池,找到对应的响应消息 + boolean flag = false; + int times = 0; + CommandResponse response = null; + while (flag == false && times < 240) { + response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); + + if (null != response && response.equals("") == false) { + flag = true; + } + + times++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO 阻塞线程被打断,需要处理异常 + // 目前的处理流程为1)记录日志;2)将命令置为超时 + logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + + return; + } + } + + // 5若未超时,将值存入数据库 + if (null != response) { + // 6根据命令类型的不同将监测值存入对应的数据库 + response.afterAction(); + } else { + // 9超时,将命令的超时标志位置1 + logger.warn("命令超时" + cmd.getId()); + cmdDao.updateCmdRecordTimeout(cmd.getId()); + } + } + } + +} diff --git a/src/com/szpg/task/SetWSThresholdTask.java b/src/com/szpg/task/SetWSThresholdTask.java new file mode 100644 index 0000000..b0fe50b --- /dev/null +++ b/src/com/szpg/task/SetWSThresholdTask.java @@ -0,0 +1,188 @@ +package com.szpg.task; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgAcuDao; +import com.szpg.db.dao.PgAlarmRuleDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgHjsbblDao; +import com.szpg.db.dao.impl.PgAcuDaoImpl; +import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgHjsbblDaoImpl; +import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgAlarmRule; +import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgHjsbbl; +import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.protocol.fins.FINSConstants; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; +import com.szpg.plc.util.Bytes; +import com.szpg.util.Configure; +import com.szpg.util.NumberFormat; + +/** + * 设置温湿度报警阈值 + * + * @author admin + * + */ +public class SetWSThresholdTask implements Runnable { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + + private PgHjsbblDao blDao = new PgHjsbblDaoImpl(); + + public SetWSThresholdTask() { + + } + + @Override + public void run() { + // 1查找所有的温湿度报警阈值 + PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); + PgDeviceDao devDao = new PgDeviceDaoImpl(); + PgAcuDao acuDao = new PgAcuDaoImpl(); + + List rules = ruleDao.findRuleByDevtype("温湿度检测仪"); + if (null != rules && rules.isEmpty() == false) { + logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]"); + + for (PgAlarmRule rule : rules) { + int deviceId = rule.getPgdeviceid(); + double wdHigh = 0.0; + double sdHigh = 0.0; + try { + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); + } + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + PgDevice device = devDao.findDeviceById(deviceId); + if (null != device) { + String deviceCode = device.getAssetcode(); + String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + + // 发送设置温度报警阈值 + SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand(); + setTemThreCmd.setThreshold((float) wdHigh); + PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet"); + if (null != temBlObj) { + setTemThreCmd.setMessageProducerId(sour); + setTemThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = temBlObj.getKszdz(); + int end = temBlObj.getJszdz(); + + // 开始字地址 + setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setTemThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) wdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setTemThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setTemThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + + // 间隔半秒设置湿度阈值 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送设置湿度报警阈值 + SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand(); + setWetThreCmd.setThreshold((float) sdHigh); + PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet"); + if (null != wetBlObj) { + setWetThreCmd.setMessageProducerId(sour); + setWetThreCmd.setDestinationId(dest); + + // SID在new对象的时候已经生成 + + // 内存区域——按字写 + setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + int start = wetBlObj.getKszdz(); + int end = wetBlObj.getJszdz(); + + // 开始字地址 + setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); + + // 字数 + int n = end - start + 1; + setWetThreCmd.setCount(n); + + // 字内容 + byte[] temps = ByteUtil.intToBins(Float.floatToIntBits((float) sdHigh)); + Bytes dataByte = new Bytes(); + for (int j = n; j > 0; j--) { + dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); + } + setWetThreCmd.setValue( dataByte.toBytes() ); + + // 解析命令对象为字节数组 + byte[] content = finspi.messageToBytes(setWetThreCmd); + + // 通过socket接口发送出去 + ACUClientUtil.getInstance().sendACUCommand(client, content); + } + } + } + + // 每个设备间隔1秒发送 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + logger.info("结束启动校正温湿度报警阈值 定时任务"); + } + } +} diff --git a/src/com/szpg/util/DataPushInterface.java b/src/com/szpg/util/DataPushInterface.java new file mode 100644 index 0000000..017ed15 --- /dev/null +++ b/src/com/szpg/util/DataPushInterface.java @@ -0,0 +1,258 @@ +package com.szpg.util; + +public class DataPushInterface { + + public static String apiUrl = Configure.getProperty("sys", "SZGLGS_API_URL", "http://10.10.2.19:9056/"); + + /** + * 推送温度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param tempValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addTempData(String zcbh, String tempValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".TemValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(tempValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送温度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addTempAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("温度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param humValue 温度值 + * @param ts 时间戳 + * @return + */ + public static String addHumData(String zcbh, String humValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".WetValue"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(humValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送湿度报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHumAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BLBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("湿度高报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param ch4Value 甲烷浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCH4Data(String zcbh, String ch4Value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(ch4Value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送甲烷报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCH4AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("甲烷高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param coValue 一氧化碳浓度值 + * @param ts 时间戳 + * @return + */ + public static String addCOData(String zcbh, String coValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(coValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送一氧化碳报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addCOAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("一氧化碳高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param o2value 氧气浓度值 + * @param ts 时间戳 + * @return + */ + public static String addO2Data(String zcbh, String o2value, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(o2value); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送氧气报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addO2AlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("氧气低浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢监测值至市管廊公司平台 + * @param zcbh 资产编号 + * @param hsValue 硫化氢浓度值 + * @param ts 时间戳 + * @return + */ + public static String addHSData(String zcbh, String hsValue, String ts) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=HJSBBLZB"); + sb.append("&Ent.BLBH=").append(zcbh + ".Value"); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BLZ=").append(hsValue); + sb.append("&Ent.SJC=").append(ts); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } + + /** + * 推送硫化氢报警记录至市管廊公司平台 + * @param bjbh + * @param zcbh + * @param bjms + * @param bjsj + * @return + */ + public static String addHSAlarmData(String bjbh, String zcbh, String bjms, String bjsj) { + StringBuilder sb = new StringBuilder(); + sb.append("tableName=BJRZB"); + sb.append("&Ent.BJBH=").append(bjbh); + sb.append("&Ent.ZCBH=").append(zcbh); + sb.append("&Ent.BJLX=").append("硫化氢高浓度报警"); + sb.append("&Ent.BJMS=").append(bjms); + sb.append("&Ent.BJSJ=").append(bjsj); + + String resp = HttpRequest.sendPostByHttp(apiUrl + "GLTHXC/api/Common/AddData", sb.toString()); + + return resp; + } +} diff --git a/src/com/szpg/util/UnicodeConvertor.java b/src/com/szpg/util/UnicodeConvertor.java new file mode 100644 index 0000000..791f2cc --- /dev/null +++ b/src/com/szpg/util/UnicodeConvertor.java @@ -0,0 +1,38 @@ +package com.szpg.util; + +import org.apache.commons.lang3.StringUtils; + +public class UnicodeConvertor { + + public static String string2Unicode(String string) { + if (StringUtils.isEmpty(string) == true) { + return ""; + } + + StringBuffer unicode = new StringBuffer(); + for (int i = 0; i < string.length(); i++) { + // 取出每一个字符 + char c = string.charAt(i); + + // 转换为unicode + unicode.append("\\u" + Integer.toHexString(c)); + } + + return unicode.toString(); + } + + public static String unicode2String(String unicode) { + StringBuffer string = new StringBuffer(); + String[] hex = unicode.split("\\\\u"); + for (int i = 1; i < hex.length; i++) { + // 转换出每一个代码点 + int data = Integer.parseInt(hex[i], 16); + + // 追加成string + string.append((char) data); + } + + return string.toString(); + } + +} diff --git a/src/log4j.properties b/src/log4j.properties index da9f862..abf92ca 100644 --- a/src/log4j.properties +++ b/src/log4j.properties @@ -4,7 +4,7 @@ #log4j.rootLogger=info, stdout log4j.logger.send=info, bytes, stdout log4j.logger.recv=info, bytes, stdout -log4j.logger.com.szpg=debug, stdout +log4j.logger.com.szpg=info, message, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out @@ -20,5 +20,12 @@ log4j.additivity.send=false log4j.additivity.recv=false +#message logger +log4j.appender.message=org.apache.log4j.DailyRollingFileAppender +log4j.appender.message.file=D\:/deploy/pgdsc/log/info.log +log4j.appender.message.layout=org.apache.log4j.PatternLayout +log4j.appender.message.layout.ConversionPattern=%d %-5p [%-4c{1}] %m%n +log4j.appender.message.encoding=UTF-8 + #other logger log4j.logger.com.mchange=error \ No newline at end of file diff --git a/src/struts.xml b/src/struts.xml index 699bbda..df8b294 100644 --- a/src/struts.xml +++ b/src/struts.xml @@ -2,15 +2,24 @@ - - - - - - + + + + + + + + + + + + + + + diff --git a/src/sys.properties b/src/sys.properties index c1febe8..5d2a163 100644 --- a/src/sys.properties +++ b/src/sys.properties @@ -11,4 +11,14 @@ LOCALHOST.UNIT = 00 #\u5b9a\u671f\u6e05\u7406\u6570\u636e\u5e93\u4e2d\u8d85\u65f6\u7684\u547d\u4ee4 -MESSAGEPOOL.REFRESH_TIME = 15 \ No newline at end of file +MESSAGEPOOL.REFRESH_TIME = 15 + +#\u5e02\u7ea7\u5e73\u53f0\u6570\u636e\u63a8\u9001\u63a5\u53e3\u5730\u5740 +SZGLGS_API_URL = http://10.10.2.19:9056/ + +#\u67e5\u8be2\u73af\u5883\u76d1\u6d4b\u6570\u636e\u5b9a\u65f6\u4efb\u52a1\u65f6\u95f4\u95f4\u9694 +READ_WS_VALUE_INTERVAL = 10 +READ_O2_VALUE_INTERVAL = 10 +READ_HS_VALUE_INTERVAL = 10 +READ_CH4_VALUE_INTERVAL = 10 +READ_CO_VALUE_INTERVAL = 10 \ No newline at end of file